go - 了解不同系统上的 tz 偏移差异
问题描述
希望有人能看到我做错了什么,或误解。我在 Go Sandbox 中使用 time pkg 来熟悉如何正确使用时区特定功能。尽管我已经知道一些偏移量,但我还是使用以下站点来仔细检查自己:https ://documentation.mersive.com/content/topics/api-timezones.htm 。在这种情况下,当我询问“America/New_York”的偏移量时,我预计为 -14400。但是,当我在 Go Sandbox 上运行以下命令时,我得到 -18000: https: //play.golang.org/p/aU0JFHzueU1
americatz, err := time.LoadLocation("America/New_York")
if err != nil {
fmt.Println(err)
return
}
t := time.Now().In(americatz)
zone, offset := t.Zone()
fmt.Printf("%v :: %v\n", zone, offset)
我注意到,当我将相同的代码带到 linux 机器上时,它完全符合我的预期。我很紧张,因为我不太清楚为什么非常常见的 tz 的两个输出会不同。我知道LoadLocation
从 ZONEINFO env var 中查找 zipfile 的知识已经足够了。否则它会在其他系统的地方,比如$GOROOT/lib/time/zoneinfo.zip
.
运行代码的 Go 服务器与 linux 服务器具有不同的区域信息文件,这真的很简单吗?如果我希望在所有系统中都具有完全相同的行为……这是否意味着我需要始终加载并设置我自己的 ZONEINFO 变量?我觉得大多数人会期望-14400 ...
谢谢。
解决方案
在操场上,时间设置为“2009 年 11 月 10 日 23:00:00 UTC”,因为“通过给程序提供确定性的输出,这样可以更容易地缓存程序”。(来自“关于”框)。
由于夏令时,这可能会对时区偏移产生影响。以下将给出您期望的答案:
today := time.Date(2020,10,16,0,0,0,0,americatz)
zone, offset = today.Zone()
fmt.Printf("%v :: %v\n", zone, offset)
更多细节:
由于夏令时,偏移量随时间变化;例如:
time.Date(2020,10,16,0,0,0,0,americatz).Zone()
将返回一个节日,-14400
而time.Date(2020,1,16,0,0,0,0,americatz).Zone()
将返回-18000
。
恰好now()
返回操场 ( 2009-11-10
) 的时间是EST
(夏令时结束,2009 年 11 月 1 日,星期日,凌晨 2:00),而不是EDT
。如果您在一个月内再次运行测试,您将不会看到这种差异,因为两次都将在EST
.
推荐阅读
- f# - 那些 F# 函数应该做什么?
- angular - 如何在多个组件中使用服务调用?
- arrays - 在golang中从redash中解组json rawdata
- git - SSH 在同一主机上以不同用户身份登录
- python - 在带有指针的 struct pack Python 中使用大端
- c# - 使用vsto如何判断word文档的表格中是否有合并单元格?
- java - 如何使用基于 Java 的配置解决 Spring MVC 中的“noHandlerFound”?
- hadoop - Hive JOIN 查询需要多长时间?
- lucene.net - Lucene.NET 4.8 版 beta 外壳问题
- graph - Zabbix 不在图表上显示文本