我正在从一些传感器获取数据,这些数据记录了各自(本地)时区的值。时间戳不指示传感器所在的时区。我调用googleway::google_timezone()
来使用谷歌时区 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 小时。我已经阅读了夏令时和时区最佳实践的答案,https://stackoverflow.com/tags/timezone/info 这些答案似乎表明此信息(夏令时)以某种方式包含在"时区"中。
还有其他方法可以做到这一点吗?
终于想通了 - 这只是 API 报告值的方式。我预计输出将报告四个小时的标准原始偏移,冬季(夏令时生效时)为一小时偏移,夏季为零小时偏移。Google API则以相反的方式做到这一点:
以下是 2018 年 1 月 11 日谷歌地图时区 API(绕过googleway::google_timezone()
)的原始输出(夏令时生效):
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"
这有点违反直觉和令人困惑,因为当夏令时无效时,夏令时偏移量具有非零值!!
无论如何,我希望这可以帮助其他人,并且有一天我们会摆脱夏令时的祸害。