CreaTools LogoCreaTools
UnixTime Converter

UnixTimeの秒とミリ秒、どちらを使うべきか

2026-03-10

結論

  • 新規API・DB設計: ミリ秒(13桁)を推奨
  • 既存システム連携: 既にあるシステムに合わせる
  • UNIX系コマンド・ログ: 秒(10桁)が慣習

「ミリ秒の方が後から精度を上げる必要がない」「言語側のデフォルトに合いやすい」という理由でミリ秒推奨。ただし、既存システムに秒で統一されている場合はそちらに合わせるのが鉄則です。


桁数の見分け方

1700000000     ← 10桁。秒。2023-11-14 22:13:20 UTC
1700000000000  ← 13桁。ミリ秒。同じ瞬間
  • 10桁 → 秒
  • 13桁 → ミリ秒
  • 9桁以下 → 1973年以前(古いログなど)or ミリ秒の頭が欠けたもの
  • 16桁 → マイクロ秒(Pythonの一部)
  • 19桁 → ナノ秒(Go)

UnixTime Converter は秒・ミリ秒を切り替えて表示できます。


言語・プラットフォーム別のデフォルト

言語/環境関数単位
JavaScriptDate.now()ミリ秒
JavaScriptnew Date().getTime()ミリ秒
JavaSystem.currentTimeMillis()ミリ秒
JavaInstant.now().getEpochSecond()
Pythontime.time()秒(小数点でms精度)
Pythonint(time.time())
PHPtime()
PHPmicrotime(true)秒(小数点でms精度)
Gotime.Now().Unix()
Gotime.Now().UnixMilli()ミリ秒
Gotime.Now().UnixNano()ナノ秒
RubyTime.now.to_i
RustSystemTime::now()秒+ナノ秒
シェルdate +%s

JavaScript/Javaはミリ秒、それ以外は秒というのが大まかな分類。混在すると桁数の違いで混乱します。


混在で起きる事故

事故1: 1000倍した値で比較

// サーバ: PHP の time() で秒を返す
const serverTime = 1700000000;

// クライアント: Date.now() でミリ秒
const clientTime = Date.now(); // 1700000000000

// 「1秒以内」と思って比較
if (clientTime - serverTime < 1000) { // ← 大量の差で常にfalse
  ...
}

単位の違いに気づかず比較すると、何兆秒という差になって判定がおかしくなります。

事故2: ミリ秒を秒として表示

const ts = 1700000000000; // ミリ秒
new Date(ts * 1000).toISOString();
// → 53880-01-01...(ありえない未来)

new Date(ms) を使うべきところで new Date(seconds) の感覚で *1000 してしまうと、5万年後の日付になります。

事故3: APIの仕様が曖昧

created_at: timestamp

これだけだと秒なのかミリ秒なのか不明。仕様書には必ず単位を明記。値の例を載せるだけでも違います:

created_at: 1700000000000  // milliseconds since epoch

新規設計での推奨

ミリ秒を選ぶべき理由

  1. 将来の精度向上:秒→ミリ秒は後から困難(過去データを倍率変換できない)
  2. JavaScriptとの相性:フロントが扱う Date.now() に直接渡せる
  3. イベントの順序判定:1秒間に複数イベントがあっても順序が保てる
  4. ログ・分析:高頻度イベントを正確に並べられる

秒を選ぶべき理由

  1. DBサイズINT(4byte)に収まる範囲が長い(〜2038年だが)
  2. 可読性:10桁の方が桁数が短い
  3. 既存ツールとの互換:UNIXコマンドラインの慣習
  4. 粒度が秒で十分なドメイン:日次バッチ、勤怠記録など

「ミリ秒で保存して、秒で見せる」も現実的

DB・API内部はミリ秒、UI表示や検索クエリでは秒、という運用も多いです:

DB: 1747816800000
↓ 表示時
UI: 2026-05-10 12:00:00

ストレージは精度優先、表示は人間優先という分離思考。


変換のスニペット

// 秒 ↔ ミリ秒
const ms = sec * 1000;
const sec = Math.floor(ms / 1000);

// 文字列 ↔ Date
const d = new Date(ms);
const ms = d.getTime();

// 文字列 ↔ ISO
new Date(ms).toISOString(); // "2026-05-10T03:00:00.000Z"
new Date("2026-05-10T03:00:00.000Z").getTime();

UnixTime Converter はこれをUI上で行います。


関連記事


迷ったらミリ秒。既存に合わせるべき場面では秒。混在だけは絶対に避ける。これが鉄則です。