SetTimeZone 设置全局时区

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtime"
  6. )
  7. func main() {
  8. // 设置进程全局时区
  9. err := gtime.SetTimeZone("Asia/Tokyo")
  10. if err != nil {
  11. panic(err)
  12. }
  13. // 使用gtime获取当前时间
  14. fmt.Println(gtime.Now().String())
  15. // 使用标准库获取当前时间
  16. fmt.Println(time.Now().String())
  17. }

执行后,输出结果为:

  1. 2023-01-06 15:27:38
  2. 2023-01-06 15:27:38.753909 +0900 JST m=+0.002758145

时区设置注意事项

SetTimeZone 方法多次调用报错

SetTimeZone 方法只允许全局设置一次时区,如果多次调用,并且设置的时区不一样,后续调用将会失败,并返回 error

业务项目中, time 包初始化问题

程序时区的全局设置必须要在标准库的 timeimport 之前调用,因为标准库的 time 包在 import 时会执行初始化,之后无法再全局修改程序时区,只能通过 ToLocation 方法(或者标准库 In 方法)对特定时间对象执行时区转换。对时间对象使用 ToLocation 转换的例子:

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtime"
  6. )
  7. func main() {
  8. // 设置进程全局时区
  9. err := gtime.SetTimeZone("Asia/Tokyo")
  10. if err != nil {
  11. panic(err)
  12. }
  13. // 使用gtime获取当前时间
  14. fmt.Println(gtime.Now())
  15. // 使用标准库获取当前时间
  16. fmt.Println(time.Now())
  17. // 对特定时间对象执行时区转换
  18. local, err := time.LoadLocation("Asia/Shanghai")
  19. if err != nil {
  20. panic(err)
  21. }
  22. fmt.Println(gtime.Now().ToLocation(local))
  23. }

执行后,终端输出:

  1. 2023-01-06 15:37:38
  2. 2023-01-06 15:37:38.753909 +0900 JST m=+0.002758145
  3. 2023-01-06 14:37:38

在业务项目中,往往在 main 包之前会有很多业务的包 import,会引起 time 包的初始化问题。因此,如果需要全局设置时区,建议通过一个独立的包来调用 SetTimeZone 方法,并且在 main 包的最开头执行 import 规避 time 包初始化的问题。例如:

相关参考链接: https://stackoverflow.com/questions/54363451/setting-timezone-globally-in-golang

  1. package main
  2. import (
  3. _ "boot/time"
  4. "fmt"
  5. "time"
  6. )
  7. func main() {
  8. // 使用gtime获取当前时间
  9. fmt.Println(gtime.Now().String())
  10. // 使用标准库获取当前时间
  11. fmt.Println(time.Now().String())
  12. }