web-dev-qa-db-ja.com

Goでは、現在のローカルタイムオフセットの値をどのように抽出できますか?

私は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)
}

この情報を取得する簡単な方法はありますか?

14

時間タイプでZone()メソッドを使用できます。

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    zone, offset := t.Zone()
    fmt.Println(zone, offset)
}

ゾーンは時間tで有効なタイムゾーンを計算し、ゾーンの省略名(「CET」など)とそのオフセットをUTCの東の秒数で返します。

22
olif

パッケージ時間

func(時間)ローカル

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(Time)In

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
8
peterSO

時間を手動で別の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))
}
5
alex vasi