Go Snippets

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 UTC
Formatted 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 layout
Timestamp 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、キュー、データベース列が期待するタイムスタンプと比較します。