在给定当前时区的情况下从 UTC 获取当前偏移量(包括夏令时)

Get current offset (incl. daylight savings) from UTC given the curren timezone

我正在从一些传感器获取数据,这些传感器在各自的(本地)时区记录值。时间戳不表示传感器所在的时区。我正在调用 googleway::google_timezone() 使用 Google 时区 API 并获取与传感器的地理位置相对应的时区。

输出如下(示例):

google_timezone(latlon, key = mykey)
$dstOffset
[1] 0

$rawOffset
[1] -18000

$status
[1] "OK"

$timeZoneId
[1] "America/Toronto"

$timeZoneName
[1] "Eastern Standard Time"

dstOffset 字段为 0,这似乎不正确(位置在加拿大东部夏令时)。我需要在服务器上以 UTC 格式保存数据。使用 attr 将本地时区转换为 UTC 无法解决夏令时问题 - 无论一年中的哪个时间,时差都保持不变。对于北美,由于夏令时,时差在一年中应改变 1 小时。我已经阅读了 Daylight saving time and time zone best practices and https://whosebug.com/tags/timezone/info 的答案,这似乎表明此信息(夏令时)以某种方式包含在 "timezone" 中。

还有其他方法吗?

终于弄明白了 - 这就是 API 报告值的方式。我希望输出报告标准原始偏移量为四小时,冬季偏移量为一小时(当夏令时生效时),夏季偏移量为零。 Google API 反过来:

这是 Google 地图时区 API(绕过 googleway::google_timezone())2018 年 1 月 11 日(夏令时有效)的原始输出:

dstOffset:  0
rawOffset:  -18000
status: "OK"
timeZoneId: "America/Toronto"
timeZoneName:   "Eastern Daylight Time"

这是 2018 年 4 月 21 日的输出(夏令时无效):

dstOffset:  3600
rawOffset:  -18000
status: "OK"
timeZoneId: "America/Toronto"
timeZoneName:   "Eastern Daylight Time"

这有点违反直觉且令人困惑,因为当夏令时未生效时夏令时偏移量具有非零值!!

无论如何,我希望这可以帮助其他人,也希望有一天我们能摆脱夏令时的祸害。