私は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)
}
この情報を取得する簡単な方法はありますか?
時間タイプでZone()メソッドを使用できます。
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
zone, offset := t.Zone()
fmt.Println(zone, offset)
}
ゾーンは時間tで有効なタイムゾーンを計算し、ゾーンの省略名(「CET」など)とそのオフセットをUTCの東の秒数で返します。
func (t Time) Local() Time
Localは、場所を現地時間に設定してtを返します。
func (t Time) Zone() (name string, offset int)
Zoneは、時間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
Inは、位置情報がlocに設定されたtを返します。
Locがnilの場合、パニックになります。
例えば、
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))
}