登录
首页 >  Golang >  Go问答

如果在流程执行期间更改时区,时间包中的区域方法不会返回更新的时区

来源:stackoverflow

时间:2024-03-30 10:18:28 470浏览 收藏

你在学习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 结构体的 biasdaylightbias 字段来获取几分钟内的 utc 偏移量。

理论要掌握,实操不能落!以上关于《如果在流程执行期间更改时区,时间包中的区域方法不会返回更新的时区》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>