我是Go新手,我正在努力格式化并显示一些IBM大型机TOD时钟数据。我想格式化GMT和本地时间的数据(作为默认值 - 否则在用户指定的区域中。)
为此,我需要将GMT的本地时间偏移值作为有符号整数秒来获取。
在zoneinfo.go中(我承认我不完全理解),我可以看到
// A zone represents a single time zone such as CEST or CET.
type zone struct {
name string // abbreviated name, "CET"
offset int // seconds east of UTC
isDST bool // is this zone Daylight Savings Time?
}
但我认为这不是导出的,所以这段代码不起作用:
package main
import ( "time"; "fmt" )
func main() {
l, _ := time.LoadLocation("Local")
fmt.Printf("%v\n", l.zone.offset)
}
有没有简单的方法来获取此信息?
答案 0 :(得分:18)
您可以在时间类型上使用Zone()方法:
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
zone, offset := t.Zone()
fmt.Println(zone, offset)
}
区域计算在时间t生效的时区,返回区域的缩写名称(例如“CET”)及其在UTC以东的秒数。
答案 1 :(得分:8)
func (t Time) Local() Time
本地返回t,位置设置为当地时间。
func (t Time) Zone() (name string, offset int)
区域计算在时间t生效的时区,返回 区域的缩写名称(例如“CET”)及其以秒为单位的偏移量 UTC以东。
type Location struct { // contains filtered or unexported fields }
位置将时间映射映射到当时正在使用的区域。 通常,Location表示时间偏移的集合 用于中欧的CEST和CET等地理区域。
var Local *Location = &localLoc
Local表示系统的本地时区。
var UTC *Location = &utcLoc
UTC代表通用协调时间(UTC)。
func (t Time) In(loc *Location) Time
在返回t中,位置信息设置为loc。
如果loc为零,恐慌。
例如,
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
// For a time t, offset in seconds east of UTC (GMT)
_, offset := t.Local().Zone()
fmt.Println(offset)
// For a time t, format and display as UTC (GMT) and local times.
fmt.Println(t.In(time.UTC))
fmt.Println(t.In(time.Local))
}
输出:
-18000
2016-01-24 16:48:32.852638798 +0000 UTC
2016-01-24 11:48:32.852638798 -0500 EST
答案 2 :(得分:4)
我认为手动将时间转换为另一个TZ并不合理。使用time.Time.In功能:
package main
import (
"fmt"
"time"
)
func printTime(t time.Time) {
zone, offset := t.Zone()
fmt.Println(t.Format(time.Kitchen), "Zone:", zone, "Offset UTC:", offset)
}
func main() {
printTime(time.Now())
printTime(time.Now().UTC())
loc, _ := time.LoadLocation("America/New_York")
printTime(time.Now().In(loc))
}