你在学习Golang相关的知识吗?本文《如果在流程执行期间更改时区,时间包中的区域方法不会返回更新的时区》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
问题内容我在下面编写了一个简单的 go 代码来获取系统时区。它工作正常并返回系统的当前时区。问题是,如果我在进程执行之间更改时区,那么它不会返回更新后的时区。它仅返回旧时区。
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 10; i++ {
t := time.Now()
zone, offset := t.Zone()
fmt.Println(zone, offset)
z, _ := t.Zone()
fmt.Println("timezone", z)
}
}
正确答案
如果您查看 source code of the time package,您会发现本地位置在应用程序启动时设置一次,即 sync.Once
(或更准确地说:获取 tz 信息时)通过第一次调用 .get()
):
// localloc is separate so that initlocal can initialize
// it even if a client has changed local.
var localloc location
var localonce sync.once
func (l *location) get() *location {
if l == nil {
return &utcloc
}
if l == &localloc {
localonce.do(initlocal)
}
return l
}
现在,initlocal
是平台相关的,因为不同的平台处理时区的方式不同;例如 for Windows 您有:
func initLocal() {
var i syscall.Timezoneinformation
if _, err := syscall.GetTimeZoneInformation(&i); err != nil {
localLoc.name = "UTC"
return
}
initLocalFromTZI(&i)
}
从这里开始,您可以通过源代码来了解如何为您的应用程序实现此功能。例如,在 windows 上,您可以通过调用 syscall.Timezoneinformation
结构体的 bias
和 daylightbias
字段来获取几分钟内的 utc 偏移量。
理论要掌握,实操不能落!以上关于《如果在流程执行期间更改时区,时间包中的区域方法不会返回更新的时区》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注编程网公众号吧!