メインコンテンツにスキップ
モジュール 8 · レッスン 4 / 5コース内の 39/50~12 min
モジュールのレッスン (4/5)

`time` パッケージ

time パッケージは、インスタント (time.Time)、期間 (time.Duration)、定期ツール (タイマー、ティッカー) という 3 つの異なる概念をモデル化します。それらを区別することは非常に重要です。インスタントはタイムライン上の点であり、デュレーションは間隔です。

time.Time — インスタント

Go
now := time.Now()                // current instant in the local timezone
utc := now.UTC()                 // same instant in UTC
later := now.Add(2 * time.Hour)  // add a duration
diff := later.Sub(now)           // 2h0m0s (it's a Duration)

fmt.Println(now.Year(), now.Month(), now.Day())
fmt.Println(now.Weekday())

time.Time は 不変です。すべてのメソッド Add、Truncate、Round は新しい Time を返します。

インスタントを比較するには、Before、After、Equal を使用します。 インスタントに異なるタイムゾーン/単調クロックを使用できる場合は、== を使用しないでください。

time.Duration — 間隔

Go
d := 250 * time.Millisecond
fmt.Println(d)         // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)

const timeout = 5 * time.Second

time.Duration は、ナノ秒をカウントする int64 のエイリアスです。定数 time.Nanosecond、time.Microsecond、time.Millisecond、time.Second、time.Minute、time.Hour の型は Duration です。

解析と書式設定: リファレンス レイアウト

Go は YYYY-MM-DD のような文字列を使用しません。 正規の参照インスタントを使用します。

Code
Mon Jan 2 15:04:05 MST 2006

つまり、01/02 03:04:05PM '06 -0700。このレイアウト (ニーモニック: 1-2-3-4-5-6-7) を覚えておくと、任意の日付をフォーマットできます。

Go
const layout = "2006-01-02 15:04:05"
s := time.Now().Format(layout)            // "2026-05-16 14:30:00"
t, err := time.Parse(layout, "2026-05-16 14:30:00")

stdlib は、既製のレイアウト、time.RFC3339 ("2006-01-02T15:04:05Z07:00")、time.RFC1123、time.Kitchen ("3:04PM") を提供します。

Go
fmt.Println(time.Now().Format(time.RFC3339))

時間を計測する

Go
start := time.Now()
work()
elapsed := time.Since(start)  // = time.Now().Sub(start)
fmt.Println("ci ha messo", elapsed)

time.Since は 単調クロック を使用します。システム クロックの調整 (NTP、夏時間) によって乱されることはありません。パフォーマンスの測定には、それが必要です。

タイマーとティッカー

  • time.After(d) は、d の後に 1 回だけ受信する chan time.Time を返します。 select で役立ちます:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) は停止可能なバリアント (t.Stop()) です。
  • time.NewTicker(d) は、d ごとに繰り返し送信します。 Goroutine リークを避けるために、defer ticker.Stop() を覚えておいてください。
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

演習

運動#go.m8.l4.e1
試行回数: 0読み込み中…

time.RFC3339 に従ってフォーマットされた現在のインスタントを出力します。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

運動#go.m8.l4.e2
試行回数: 0読み込み中…

time.since を使用して、10ms の Sleep にかかる時間を測定し、結果を出力します。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

Quiz#go.m8.l4.e3
準備完了

定数「time.Second」はどのような型ですか?

Go
d := time.Second
// d ha tipo ???
回答の選択肢