Unix タイムスタンプ FAQ
Unix タイムスタンプに関する最もよくある質問への手早い回答 — 単位、タイムゾーン処理、2038 年問題、言語ごとの変換など。
よくある質問
Unixタイムスタンプ、エポック時間、タイムゾーン、時間の正しい保存に関するよくある質問を、トピック別に整理しました。回答はクイックリファレンスとして使ってください。より詳しいガイドはページ下部にリンクしています。
次はどこへ
FAQ
- Unix タイムスタンプとは?
- Unix タイムスタンプは、Unix エポック — 1970 年 1 月 1 日 00:00:00 UTC — から経過した秒数です。言語に依存せず、タイムゾーンに依存しない整数で、あらゆる時点を一意に識別します。
- Unix エポックとは?
- Unix エポックは 1970 年 1 月 1 日 00:00:00 UTC です。すべての Unix タイムスタンプは、この固定された基準点から前方へ — 負の値の場合は後方へ — 測られます。1970 年が選ばれたのは実用的な理由です。ベル研究所で Unix が設計されていた当時、最近の区切りのよい年でした。
- 10 桁と 13 桁のタイムスタンプの違いは?
- 10 桁のタイムスタンプ(例:1700000000)はエポックからの秒を表します。13 桁のタイムスタンプ(例:1700000000000)はミリ秒を表します。JavaScript の Date.now() はミリ秒を返します。ほとんどの Unix システムコールや、Python、Go、PHP などの言語は既定で秒を返します。
- なぜ JavaScript は秒ではなくミリ秒を使うのか?
- JavaScript の Date API は、1995 年に利用可能だったシステムタイマーの分解能に合わせて設計されました。ミリ秒を使うことで、1 秒未満の時間の精度損失を避けられます。サーバーが生成した秒単位の Unix タイムスタンプを扱うときは、new Date() に渡す前に 1000 を掛けてください。
- JavaScript で Unix タイムスタンプを読みやすい日付に変換するには?
- 秒のタイムスタンプには:new Date(1700000000 * 1000).toISOString()。ミリ秒のタイムスタンプには:new Date(1700000000000).toISOString()。どちらも '2023-11-15T06:13:20.000Z' のような ISO 8601 文字列を生成します。ローカライズ表示には timeZone オプション付きの toLocaleString() を使ってください。
- Unix タイムスタンプはタイムゾーンを認識するか?
- いいえ。Unix タイムスタンプは常に UTC の単一の瞬間を表します。タイムゾーン情報は、表示用にタイムスタンプを整形するときにのみ適用されます。異なるタイムゾーンの 2 台のデバイスは、同じ瞬間に対して同じ Unix タイムスタンプを生成します。
- 2038 年問題とは?
- Unix タイムスタンプを 32 ビット符号付き整数で保存するシステムは、2,147,483,647 までの値しか表現できず、これは 2038 年 1 月 19 日 03:14:07 UTC に相当します。その瞬間を過ぎると整数は大きな負の数にオーバーフローします。現代の 64 ビットシステムは影響を受けませんが、組み込みシステムやレガシーなデータベースは依然としてリスクがある可能性があります。
- 負の Unix タイムスタンプとは?
- 負の Unix タイムスタンプは Unix エポックより前の瞬間を表します。たとえば -86400 は 1969 年 12 月 31 日 00:00:00 UTC です。ほとんどの現代の日付 API は負のタイムスタンプを正しく扱いますが、一部の古いシステムやデータベースはサポートしていません。
- Python で Unix タイムスタンプを取得するには?
- 秒には import time; int(time.time()) を使います。明示的な UTC datetime には:import datetime; int(datetime.datetime.now(datetime.timezone.utc).timestamp())。ミリ秒には:int(time.time() * 1000)。
- Unix タイムスタンプの精度は?
- 標準的な Unix タイムスタンプは 1 秒精度です。1 秒未満の精度には、ミリ秒タイムスタンプ(13 桁)が Web API や JavaScript で一般的です。一部のシステムはマイクロ秒(16 桁)やナノ秒を使います。適切な単位は、アプリケーションが実際に必要とする精度によります。
- Unix タイムスタンプはどれくらい大きくなれるか?
- 64 ビット符号付き整数(今日の標準)では、Unix タイムスタンプはおよそ 2920 億年前から 2920 億年後までの任意の瞬間を表現できます。有名な 32 ビットの限界(2038 年問題)はレガシーシステムにのみ当てはまります。
- なぜ私のタイムスタンプは 1970 年と表示されるのか?
- たいてい次の 3 つのいずれかが原因です:値が 0(エポックそのもの)、値がミリ秒なのに秒として扱われた(そのため 0 付近の極小の秒値に丸められる)、または値が null/undefined でコードが既定値の 0 を使った。
- UTC と GMT の違いは?
- ほとんどの目的で UTC と GMT は交換可能です。UTC(協定世界時)は現代の原子時計標準で、GMT(グリニッジ標準時)はオフセットゼロのタイムゾーンを指すレガシーな用語です。英国とほとんどのソフトウェアはこれらを同等として扱います。
- 日付は Unix タイムスタンプと ISO 8601 文字列のどちらで保存すべきか?
- どちらも有効です。Unix 整数はコンパクトで比較が容易です。ISO 8601 文字列は自己記述的で人間が読めます。データベースでは、ネイティブの datetime 型(Postgres の TIMESTAMP WITH TIME ZONE、MySQL の DATETIME(6))がたいてい最適です。タイムゾーンの意味を保持し、効率的にインデックスできるためです。
- サーバーのローカル時刻を保存しても安全か?
- いいえ。オフセットなしでローカル時刻を保存すると、サーバーが移動したり、DST が変わったり、別のゾーンの別のサーバーが値を読むたびに情報が失われます。UTC(Unix タイムスタンプまたはタイムゾーン対応の datetime)で保存し、ローカル時刻への変換は表示層でのみ行ってください。
- Unix タイムスタンプはうるう秒を含むか?
- POSIX の Unix 時間は意図的にうるう秒を無視します — 追加の UTC 秒が挿入されても、Unix の 1 日は正確に 86,400 秒です。実際の秒番号が繰り返されるか、システムに応じて時計が平滑化されます。