在 time/zoneinfo_js.go
中,本地时区由 JS 调用返回的 UTC 偏移量决定:
(new Date()).getTimezoneOffset()
然而,UTC offset != timezone
和这种行为会导致显示“夏令时”时间的问题。这种行为是意外的且未记录的,我希望 time.Local 被设置为 JS 环境的时区(如果可用)而不是当前的 UTC 偏移量。
可以使用国际化 API 在 JS 中确定时区:
Intl.DateTimeFormat().resolvedOptions().timeZone
只要已经导入/嵌入了 tzdata 包并使其 init 函数首先运行,将以下代码添加到 initLocal 的开头(理论上)应该解决这个问题。
func initLocal() {
if intl := js.Global().Get("Intl"); !intl.IsUndefined() {
var err error
tz := js.Global().Get("Intl").Call("DateTimeFormat").Call("resolvedOptions").Get("timeZone").String()
Local, err = LoadLocation(tz)
if err == nil {
return
}
}
...
3条答案
按热度按时间wixjitnu1#
国际化API是最初采用的方法。但后来在CL https://go-review.googlesource.com/c/go/+/143577 中出现了一些反复,最终决定从
new Date()
解析时区偏移量。cc @neelance
jbose2ul2#
我认为这里的真正问题是,当时还没有 https://golang.org/pkg/time/tzdata/ ,因此 wasm 二进制文件从未包含任何时区数据。在 wasm 上调用
LoadLocation
根本不起作用。现在既然 6d63a74 添加了 time/tzdata,我们可以重新考虑这个问题。
jexiocij3#
如果有人发现这个
对于
GOOS=js GOARCH=wasm
time.LoadLocation
不起作用但是你可以在主函数中使用
import _ "time/tzdata"
,然后time.LoadLocation
就可以工作了