go 时间:js/wasm将time.Local设置为UTC偏移量而不是实际时区,

pgky5nke  于 4个月前  发布在  Go
关注(0)|答案(3)|浏览(76)

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
		}
	}
	...
wixjitnu

wixjitnu1#

国际化API是最初采用的方法。但后来在CL https://go-review.googlesource.com/c/go/+/143577 中出现了一些反复,最终决定从new Date()解析时区偏移量。
cc @neelance

jbose2ul

jbose2ul2#

我认为这里的真正问题是,当时还没有 https://golang.org/pkg/time/tzdata/ ,因此 wasm 二进制文件从未包含任何时区数据。在 wasm 上调用 LoadLocation 根本不起作用。
现在既然 6d63a74 添加了 time/tzdata,我们可以重新考虑这个问题。

jexiocij

jexiocij3#

如果有人发现这个
对于 GOOS=js GOARCH=wasm
time.LoadLocation 不起作用
但是你可以在主函数中使用 import _ "time/tzdata" ,然后 time.LoadLocation 就可以工作了

相关问题