Go で異なるタイム ゾーンを操作する

Go で異なるタイム ゾーンを操作する

タイムゾーンは、日付と時刻を扱うすべてのアプリケーションにとって重要です。もちろん、これは、大陸や場所を超えてユーザーにサービスを提供するアプリに特に当てはまります。タイム ゾーンは、世界中の特定の場所の協定世界時 (UTC) からのオフセットを決定します。これらは、正確で信頼性の高い時間処理を確保する上で重要な役割を果たします。

Go は、時間とタイム ゾーンを操作するための標準ライブラリに time パッケージを提供します。time パッケージを使用して、さまざまな場所でタイム ゾーンを取得して変換できます。

タイムパッケージ

timeパッケージは、時間と日付の操作、時間の測定と表示、およびうるう秒のないグレゴリオ暦を使用した日付の操作のための機能を提供します。

time パッケージは、タイムゾーンの設定に使用できる場所フィールドを含むTime構造体型を提供します。

import ステートメントを使用して時間パッケージをインポートできます。

import "time"

time 構造体型とそのフィールドは次のとおりです。フィールドはエクスポートされていないため、公式ドキュメントにはありません。

package main

type Time struct {
    // wall is the wall time in the format returned by the runtime.nanotime()
    // function.
    wall uint64

    // ext is the monotonic clock reading in the format returned by
    // runtime.nanotime().
    ext int64

    // loc is a pointer to the Location struct associated with this time.
    loc *Location
}

type Location struct {
    // name is the time zone name, such as "UTC"or "PST".
    name string

    // zone contains information about the time zone abbreviation, offset,
    // and rule for a single time zone in the location.
    zone []zone

    // tx contains information about when the time zone abbreviation or
    // offset changes for a location.
    tx []zoneTrans

    // extend contains the name of a parent time zone if this location
    // extends from another one.
    extend string

    // cacheStart and cacheEnd are Unix timestamps that deine the range
    // for which the cacheZone field is valid.
    cacheStart int64
    cacheEnd int64

    // cacheZone points to the zone that is currently valid for the time
    // range defined by cacheStart and cacheEnd.
    cacheZone *zone
}

タイム ゾーン メソッドを含め、多くのメソッドが Time およびLocation構造体を使用します。

タイムゾーン情報を読み込んでいます

タイム ゾーン情報の読み込みは、タイム ゾーンを操作する際の基本的な操作の 1 つです。LoadLocationメソッドは、 IANA タイム ゾーン データベースからタイム ゾーン情報をロードする機能を提供します。LoadLocationメソッドは、タイム ゾーンの名前を受け取り、位置情報と処理のためのエラーを返します。タイム ゾーン情報が読み込まれると、タイム ゾーンに関連付けられたtime struct インスタンスが作成されます。

import (
    "fmt"
    "time"
)

func main() {
    // Load the time zone location for America/New_York
    loc, err: = time.LoadLocation("America/New_York")

    if err! = nil {
        fmt.Println("Error loading location:", err)
        return
    }

    // Get the current time at a location
    now: = time.Now().In(loc)
    fmt.Println("Current time in New York:", now)
}

Now関数のInメソッドは、場所を受け取り、そこに時間を出力します。

NYの現在時刻を出力した結果

さらに、場所の文字列と UTC からのタイム ゾーンのオフセットがわかっている場合は、 FixedZoneメソッドを使用して場所の現在の時刻を読み込むことができます。最初に、現在の時刻を UTC で読み込む必要があります。次に、FixedZone メソッドを使用して、文字列とオフセットに基づいて位置を読み込み、その位置を時間インスタンスの In メソッドに渡します。

import (
    "fmt"
    "time"
)

func main() {
    // Get the current time in UTC
    now: = time.Now().UTC()

    // Set the time zone for Lagos
    lagos: = now.In(time.FixedZone("WAT", 3600))

    // Print the current time in both locations
    fmt.Println("Current time in Lagos:", lagos)
}

メイン関数は、Lagos の現在の時刻をコンソールに出力します。

タイムゾーン期間の測定

time パッケージは、 time.Time値に関連付けられたタイム ゾーンの省略形とオフセットを取得するためのZoneメソッドを提供します。Zone メソッドは、タイム ゾーンの省略形を表す文字列 (たとえば、”America/New_York” の “EST”) と、UTC から東への秒数を表す整数を返します。

import (
    "fmt"
    "time"
)

func main() {
    // Load the time zone location for America/New_York
    loc, err: = time.LoadLocation("America/New_York")

    if err! = nil {
        fmt.Println("Error loading location:", err)
        return
    }

    // Get the current time in UTC and the specified location
    t1: = time.Now()
    t2: = t1.In(loc)

    // Get the offset in seconds for each time zone
    //for the time zones
    _, offset1: = t1.Zone()
    _, offset2: = t2.Zone()

    // Calculate the duration of the time zone shift
    // between UTC and America/New_York
    duration: = offset2 - offset1

    fmt.Printf("The time zone shift duration" +
      "between UTC and New York is: %d seconds", duration)
}

メイン関数では、Zone メソッドが 2 つのタイム ゾーン間のタイム ゾーン シフトの期間を測定します (time.Time 値)。t1変数は UTC での現在時刻であり、t2変数は「America/New_York」タイム ゾーンでの現在時刻です。

この関数は、タイム ゾーンのシフトを秒単位で表す期間変数 (タイム ゾーン間のオフセットの差) を出力します。

タイムゾーン間の時間の評価

タイム ゾーン間の期間がわかっている場合は、タイム ゾーン間の時間を評価できます。time.Time 構造体インスタンスの In メソッドのAddメソッドを使用して、タイム ゾーンの時間に期間を追加できます。

import (
    "log"
    "time" // import the time package
)

func evaluateTime(t time.Time, duration time.Duration) time.Time {
    // load the location for Africa/Lagos
    location, err: = time.LoadLocation("Africa/Lagos")

    if err! = nil {
        log.Println("There was an error loading the location")
    }

    return t.In(location).Add(duration)
}

evaluateTime関数は、 time.Time インスタンスと time.Duration 型の期間を受け取り、タイム ゾーンで時間を返します。「アフリカ/ラゴス」の現在の時間を読み込み、時間に期間を追加します。

Time パッケージで時間と日付を操作する

time パッケージは、時間と日付の両方を操作するのに非常に用途が広いです。time パッケージは、時間を Unix 時間に変換するための Unix()、ゴルーチンを一時停止するための Sleep()、時間値を文字列にフォーマットするための Format() などの関数を提供します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です