Unixタイムスタンプとは?変換方法・使い方を解説
Webアプリケーションやサーバーのログを見ていると、1725148800 のような数字を目にすることがあります。これが「Unixタイムスタンプ」です。プログラミングでの日時管理において非常に重要な概念で、ほぼすべての言語・システムで採用されています。この記事では、Unixタイムスタンプの仕組みから、日時との変換方法、JavaScriptでの実装例、ミリ秒・秒の違いまで詳しく解説します。
Unixタイムスタンプとは
Unixタイムスタンプ(Unix timestamp)とは、1970年1月1日 00:00:00 UTC(協定世界時)を起点(エポック)として、そこからの経過秒数を整数で表したものです。「Unixエポック時刻」「POSIXタイム」とも呼ばれます。
例えば、2025-09-01 00:00:00 UTC は Unixタイムスタンプで 1756684800 となります。この数値一つで、世界中のどこで見ても同じ瞬間を指すことができます。
タイムゾーンの情報を含まないシンプルな整数であるため、データベースへの保存・比較・演算が容易というメリットがあります。
なぜUnixタイムスタンプが使われるのか
日時をそのまま文字列("2025-09-01 09:00:00")で保存する方法もありますが、Unixタイムスタンプが広く使われる理由がいくつかあります。
| 比較項目 | Unixタイムスタンプ | 日時文字列 |
|---|---|---|
| タイムゾーン | UTC基準で統一 | タイムゾーン考慮が必要 |
| 比較・計算 | 数値として簡単 | パースが必要 |
| データサイズ | 小さい(整数) | 大きい(文字列) |
| 可読性 | 人には読みにくい | 直感的にわかる |
| 言語間の互換性 | どの言語でも共通 | フォーマット依存 |
特に国際的なシステムや複数のサーバーを跨ぐ処理では、Unixタイムスタンプによるタイムゾーン非依存の時刻管理が不可欠です。
日時との変換方法
Unixタイムスタンプと日時の変換は、プログラミング言語ごとに標準ライブラリが提供されています。手動で計算する必要はほとんどありませんが、仕組みを理解しておくと役立ちます。
基本的な考え方は、「エポック(1970-01-01 00:00:00 UTC)からの経過秒数」です。例えば1日は 60秒 × 60分 × 24時間 = 86,400秒なので、タイムスタンプが86,400増えると1日進みます。
JavaScriptでの変換コード例
JavaScriptでは Date オブジェクトを使って簡単にUnixタイムスタンプを扱えます。
// 現在のUnixタイムスタンプ(ミリ秒)を取得
const timestampMs = Date.now();
console.log(timestampMs); // 例: 1756684800000
// 現在のUnixタイムスタンプ(秒)を取得
const timestampSec = Math.floor(Date.now() / 1000);
console.log(timestampSec); // 例: 1756684800
// Unixタイムスタンプ(秒)からDateオブジェクトへ変換
const timestamp = 1756684800;
const date = new Date(timestamp * 1000); // ミリ秒に変換してから渡す
console.log(date.toISOString()); // "2025-09-01T00:00:00.000Z"
// ローカル時刻でのフォーマット
console.log(date.toLocaleString('ja-JP', { timeZone: 'Asia/Tokyo' }));
// "2025/9/1 9:00:00"(日本時間)
// 日時文字列からUnixタイムスタンプ(秒)へ変換
const dateStr = '2025-09-01T00:00:00Z';
const fromStr = Math.floor(new Date(dateStr).getTime() / 1000);
console.log(fromStr); // 1756684800new Date() のコンストラクタにはミリ秒を渡すことに注意してください。サーバーから受け取ったタイムスタンプが秒単位の場合は、必ず × 1000 してから渡す必要があります。
ミリ秒 vs 秒の違いと注意点
Unixタイムスタンプには「秒単位」と「ミリ秒単位」の2種類が存在します。これが混同されると深刻なバグの原因になります。
| 単位 | 例(2025-09-01) | 主な使用箇所 |
|---|---|---|
| 秒(s) | 1756684800 | Unix/Linux、Python、PHP、データベース |
| ミリ秒(ms) | 1756684800000 | JavaScript(Date.now())、Java |
見分ける簡単な方法は桁数を確認することです。2025年現在、秒単位のタイムスタンプは10桁、ミリ秒単位は13桁になります。
よくあるバグ:単位の混同
秒単位のタイムスタンプをそのまま new Date() に渡すと、1970年1月1日付近の日時として解釈されます。必ず × 1000 してミリ秒に変換してから渡しましょう。逆に、ミリ秒を秒として扱うと、日時が約31年分ずれてしまいます。
2038年問題とは
32ビット整数でUnixタイムスタンプを保存している古いシステムでは、2038年1月19日 03:14:07 UTC を過ぎると数値がオーバーフローし、1901年に戻ってしまう問題があります(Y2K38問題)。現代のシステムでは64ビット整数を使うことでこの問題は回避されていますが、レガシーシステムを扱う際は注意が必要です。
よくある質問
Q. Unixタイムスタンプはタイムゾーンの影響を受けますか?
A. 受けません。Unixタイムスタンプは常にUTC(協定世界時)を基準にした経過秒数です。日本時間(JST)やアメリカ東部時間(EST)などのローカルタイムゾーンに依存しないため、異なる国のサーバー間での時刻の同期が正確に行えます。表示する際にローカル時刻に変換します。
Q. なぜ1970年1月1日が起点なのですか?
A. Unix OSが開発された当時(1960年代後半〜1970年代初頭)、開発者たちが「覚えやすくキリのいい日付」として1970年1月1日を選んだとされています。歴史的な経緯によるもので、技術的に特別な意味があるわけではありません。
Q. データベースにはどの形式で保存すべきですか?
A. 用途によります。ソートや範囲検索が多い場合はINT型でUnixタイムスタンプを保存すると高速です。人間が直接確認・編集する可能性がある場合はDATETIME型が便利です。多くのシステムではDATETIME型(または TIMESTAMP型)を使い、DBがタイムゾーン変換を管理するのが一般的です。
Q. マイナスのタイムスタンプは何を意味しますか?
A. 1970年1月1日 00:00:00 UTC より前の日時を表します。例えば -86400 は 1969年12月31日を意味します。JavaScriptの new Date(-86400000) でも正しく変換できます。
Q. ブラウザ上での変換は安全ですか?
A. はい。このツールはすべての変換処理をブラウザ内(クライアントサイド)で行っています。入力した値はサーバーに送信されません。
まとめ
Unixタイムスタンプはシンプルな整数ですが、タイムゾーンに依存しない信頼性の高い時刻表現としてプログラミングの基盤となっています。JavaScriptでは Date.now() でミリ秒、Math.floor(Date.now() / 1000) で秒単位のタイムスタンプを取得でき、new Date(timestamp * 1000) で日時に変換できます。秒とミリ秒の混同に注意しながら活用してください。