我在尝试格式化和显示一些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)
}
是否有一种简单的方法来获取此信息?
您可以在时间类型上使用Zone()方法:
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
zone, offset := t.Zone()
fmt.Println(zone, offset)
}
Zone计算在时间t生效的时区,返回时区的缩写名称(例如“ CET”)及其在UTC以东的秒数内的偏移量。
func (t Time) Local() Time
本地返回t,并且位置设置为本地时间。
func (t Time) Zone() (name string, offset int)
Zone计算在时间t生效的时区,并返回区域的缩写名称(例如“ CET”)及其偏移量(以秒为单位)UTC以东。
type Location struct { // contains filtered or unexported fields }
A Location将时刻映射到当时正在使用的区域。通常,位置表示时间偏移量的集合在地理区域使用,例如中欧的CEST和CET。
var Local *Location = &localLoc
Local表示系统的本地时区。
var UTC *Location = &utcLoc
UTC代表世界标准时间(UTC)。
func (t Time) In(loc *Location) Time
In返回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
我认为手动将时间转换为另一个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))
}