如何在Golang中获取其他时区的当前时间戳?

89

我需要获取不同时区的当前时间。

目前,我们可以通过以下方式实现:

t := time.Now()
fmt.Println("Location:", t.Location(), ":Time:", t)
utc, err := time.LoadLocation("America/New_York")
if err != nil {
    fmt.Println("err: ", err.Error())
}
fmt.Println("Location:", utc, ":Time:", t.In(utc))

LoadLocation名称被认为是与IANA时区数据库中的文件对应的位置名称,例如“America/New_York”。

如果给定国家名称或GMT偏移量(例如+530表示印度),是否有更简单的方法获取当前时间?

编辑:我还想支持夏令时。


5
虽然有些情况下使用固定偏移量是合适的,但通常最好使用“大陆/城市”格式。时区和夏令时规则是政治问题并且会变化。使用“大陆/城市”格式将允许您的应用程序随着基础IANA时区数据库的更新而进行调整。它还将为您处理夏令时。 - Schwern
4个回答

125
//init the loc
loc, _ := time.LoadLocation("Asia/Shanghai")

//set timezone,  
now := time.Now().In(loc)

3
我猜你的意思是:now := time.Now().In(loc)该代码的作用是获取当前时间并转换为指定时区(由变量loc定义)的时间。 - Dave Appleton
3
位置时区信息是从系统中获取的,有可能找不到位置字符串。如果未找到位置,则您的二进制文件将崩溃,因此请确保处理此错误。 - DMin

18

不,那是最好的方法。您可以使用FixedZone创建自定义的Location并使用该自定义位置。

FixedZone返回一个使用给定区域名称和偏移量(相对于UTC向东的秒数)的位置。


4
谢谢Fabrizio!我也想支持夏令时。你有任何建议吗? - Kartik Sura
3
我不清楚如何定义自定义的夏令时设置,但是数据库中的时区已经支持夏令时。 - MffnMn

5

我喜欢这种方式

//init the loc
loc, _ := time.LoadLocation("Asia/Shanghai")

//set timezone,  
now := time.Now().In(loc)

我在哪里可以找到位置名称?

您可以在zoneinfo.zip中找到它。

一些示例

package _test

import (
    "fmt"
    "testing"
    "time"
)

func TestTime(t *testing.T) {
    myT := time.Date(2022, 4, 28, 14, 0, 0, 0, time.UTC)
    for _, d := range []struct {
        name     string
        expected string
    }{
        {"UTC", "2022-04-28 14:00:00 +0000 UTC"},
        {"America/Los_Angeles", "2022-04-28 07:00:00 -0700 PDT"},
        {"Asia/Tokyo", "2022-04-28 23:00:00 +0900 JST"},
        {"Asia/Taipei", "2022-04-28 22:00:00 +0800 CST"},
        {"Asia/Hong_Kong", "2022-04-28 22:00:00 +0800 HKT"},
        {"Asia/Shanghai", "2022-04-28 22:00:00 +0800 CST"},
    } {
        loc, _ := time.LoadLocation(d.name)
        if val := fmt.Sprintf("%s", myT.In(loc)); val != d.expected {
            fmt.Println(val)
            t.FailNow()
        }
    }
}

0

这里没有提到的是如何将一个time.Time值从一个地点或时区切换到另一个地点或时区。以下是我的方法:

time.Local = time.UTC // default to UTC for all time values

func California() *time.Location {
    la, err := time.LoadLocation("America/Los_Angeles")
    if err != nil {
        panic("should not error on generating current time in la")
    }
    return la
}

func Chicago() *time.Location {
    chicago, err := time.LoadLocation("America/Chicago")
    if err != nil {
        panic("should not error on generating current time in chicago")
    }

    return chicago
}

caNow := time.Now().In(California()) // get Now in California
chiNow := time.Now().In(Chicago()) // get Now in Chicago

otherChiNow := caNow.In(Chicagio()) // convert CA time to CHI time

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接