Go timeパッケージ
Goのtimeパッケージを使ったUnix timestamp操作ガイド。time.Now()、Unix変換、参照時刻によるフォーマット、Duration演算を網羅的に解説。
Language
time.Now().Unix()
詳細な説明
Goのtimeパッケージは、timestampを扱うためのクリーンでよく設計されたAPIを提供します。中心的な型はtime.Timeで、内部的にナノ秒精度の壁掛け時計の読みと単調クロックの読みを格納しています。
timestampの取得:
import "time"
// 現在時刻をtime.Timeとして
now := time.Now()
// 各精度のUnix timestamp
now.Unix() // 秒: 1700000000
now.UnixMilli() // ミリ秒: 1700000000000
now.UnixMicro() // マイクロ秒: 1700000000000000
now.UnixNano() // ナノ秒: 1700000000000000000
Unix timestampからtime.Timeへの変換:
// 秒から
t := time.Unix(1700000000, 0)
// ミリ秒から
t := time.UnixMilli(1700000000000)
// ナノ秒から(第2引数はナノ秒オフセット)
t := time.Unix(0, 1700000000000000000)
Goのユニークなフォーマットシステム:
Goは%Y-%m-%dのようなフォーマット指定子の代わりに、参照時刻を使用します。参照時刻はMon Jan 2 15:04:05 MST 2006(01/02 03:04:05 PM '06 -0700という1-2-3-4-5-6-7のニーモニック)です:
t.Format("2006-01-02T15:04:05Z07:00") // ISO 8601
t.Format(time.RFC3339) // 定義済み定数
t.Format("2006-01-02") // 日付のみ
t.Format("15:04:05") // 時刻のみ
Duration演算:
// 24時間後
tomorrow := now.Add(24 * time.Hour)
// 2つの時点間の時間
elapsed := time.Since(start) // time.Duration
elapsed.Seconds() // float64として
よくある落とし穴:
Goのtime.Timeは壁掛け時計と単調クロックの両方のコンポーネントを含んでいます。単調部分により、time.Since()とtime.Until()はクロック調整(NTP同期など)の影響を受けません。ただし、JSONやデータベースにシリアライズすると単調クロックの読みは失われます。これは通常問題ありませんが、デシリアライズしたTimeとtime.Now()を比較する際は、内部的に異なるクロックソースを使用していることに注意してください。
タイムゾーン処理: IANAタイムゾーンの読み込みにはtime.LoadLocation("America/New_York")を使用します。AlpineベースのDockerコンテナではタイムゾーンデータベースが欠落している場合があります。tzdataパッケージをインストールするか、import _ "time/tzdata"(Go 1.15以降)でコードに埋め込んでください。
ユースケース
Goのバックエンドサービスではtime.Now().Unix()が、キャッシュキーの生成、レートリミッターのウィンドウ設定、クラウドネイティブアプリケーションの構造化ログへのtimestamp付与に使用されています。