我需要获取不同时区的当前时间。
目前我知道我们可以做到以下几点:
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,是否有更简单的方法来获取当前时间?
编辑:我还想支持夏令时。
//init the loc
loc, _ := time.LoadLocation("Asia/Shanghai")
//set timezone,
now := time.Now().In(loc)
不,这是最好的方法。您可以使用 FixedZone 创建自定义Location
并使用该自定义位置。
FixedZone 返回一个始终使用给定区域名称和的位置,并且 偏移量(UTC 以东的秒数)。
我喜欢这种方式
//init the loc
loc, _ := time.LoadLocation("Asia/Shanghai")
//set timezone,
now := time.Now().In(loc)
在哪里可以找到位置的名称?
你可以在区域信息上看到它.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()
}
}
}
这里没有提到的是如何将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