Go の Unix タイムスタンプ スニペット
Unix 秒・ミリ秒・ナノ秒、タイムスタンプの time.Time への変換、RFC3339 やカスタムレイアウトでの整形を行う Go の例。
Current Unix timestamp (seconds)
package main
import "time"
func main() {
ts := time.Now().Unix()
}Current Unix timestamp (milliseconds)
time.Now().UnixMilli()Current Unix timestamp (nanoseconds)
time.Now().UnixNano()time.Time from Unix timestamp
import "time"
t := time.Unix(1700000000, 0)
t.UTC() // ensure UTCFormatted string
import "time"
t := time.Unix(1700000000, 0)
t.Format(time.RFC3339) // "2023-11-15T06:13:20Z"
t.Format("2006-01-02 15:04:05") // custom layoutTimestamp from time.Time
import "time"
t, _ := time.Parse(time.RFC3339, "2023-11-15T06:13:20Z")
t.Unix()Go のタイムスタンプの基本
Go の time パッケージには Unix 秒・ミリ秒・ナノ秒の直接的なヘルパーがあります。秒には time.Now().Unix()、JavaScript 互換のミリ秒には time.Now().UnixMilli() を使います。
time.Time 値の整形
Unix 秒から time.Time を作るには time.Unix(seconds, 0) を使い、決定的な出力が欲しいときは UTC() を呼びます。API レスポンスには通常 RFC3339 が最適な文字列形式です。
Go の本番運用メモ
Go の time.Time はロケーションを持ちますが、Unix タイムスタンプは常に単一の UTC 時点を表します。API とデータベースの境界でタイムスタンプを正規化し、ユーザーやビジネスルールがローカル時刻を必要とするときに明示的なロケーションで整形します。これにより比較が単純になり、サーバーのローカル設定が出力を変えるのを防げます。
- ログ、キュー、データベースフィールドの Unix 秒には time.Now().Unix() を使う
- JavaScript 互換の値には time.Now().UnixMilli() を使う
- 決定的な文字列を整形する前に time.Unix(seconds, 0).UTC() を使う
- API レスポンスには time.RFC3339 または time.RFC3339Nano を使う
FAQ
- time.Time と Unix 秒のどちらを保存すべきか?
- カレンダー操作が必要なときは Go 内で time.Time を使ってください。値をインデックス化・クエリ・他システムと共有する必要があるときは、Unix 秒またはデータベースのタイムスタンプ型を保存してください。
- time.Unix はどの単位を期待するのか?
- time.Unix は秒とナノ秒を別々の引数として期待します。ミリ秒を受け取った場合は、time.Unix を呼ぶ前に値を分割または変換してください。
- Go の出力を検証するには?
- 値を t.UTC().Format(time.RFC3339) で整形し、書き込み先の API、キュー、データベース列が期待するタイムスタンプと比較します。