Unix タイムスタンプと日付を変換する方法(およびその逆)
Unix エポック秒を任意のタイムゾーンで人間が読める日付に変換。実用例とともに。
Unix タイムスタンプとは?
Unix タイムスタンプ(Unix time、POSIX time、epoch time とも呼ばれます)は、1970 年 1 月 1 日 UTC 00:00:00 から経過した秒数で、閏秒は含みません。この瞬間は Unix エポックと呼ばれます。
例えば:
- 0 = 1970-01-01 00:00:00 UTC(エポック)
- 1,000,000,000 = 2001-09-09 01:46:40 UTC("10 億秒")
- 1,234,567,890 = 2009-02-13 23:31:30 UTC
- 1,700,000,000 = 2023-11-14 22:13:20 UTC
- 2,000,000,000 = 2033-05-18 03:33:20 UTC
Unix タイムスタンプはコンピューティングのあらゆるところにあります:
- データベース:PostgreSQL、MySQL、SQLite はすべて時間を Unix タイムスタンプとして(またはそれを参照して)内部に保存します。
- ファイルシステム:ext4、NTFS、APFS はファイル更新時刻を Unix タイムスタンプとして保存します。
- API:JSON API はタイムスタンプを整数で返すことが一般的です(例:`"created_at": 1700000000`)。
- ログ:ほとんどのログシステムは Unix 形式でタイムスタンプを出力します。
- プログラミング言語:PHP、Python、JavaScript、Go、Rust、Java にはすべて組み込みサポートがあります。
Unix タイムスタンプが普及している理由:それらは単純な整数で、比較、並べ替えが容易で、タイムゾーンに依存せず(常に UTC を参照)、保存が簡単です。また、算術も簡単になります —— 2 つのイベントの期間を見つけるには、タイムスタンプを減算するだけです。
Unix タイムスタンプの読み方
メンタルモデル:1970 年 1 月 1 日 UTC 真夜中から動き始めた時計を想像してください。その時計はその後ずっと秒を数え続けています。Unix タイムスタンプはその時計の読み値です。
``` 1 分 = 60 秒 1 時間 = 3,600 秒 1 日 = 86,400 秒 (24 × 60 × 60) 1 週 = 604,800 秒 (7 × 86,400) 1 年 ≈ 31,536,000 秒 (平均 365.25 × 86,400) 1 十年 ≈ 315,360,000 秒 ```
いくつかの暗算アンカー:
- 1,000,000,000 = 2001-09-09。Unix 10 億秒 —— 10 桁の秒の最初。
- 1,500,000,000 = 2017-07-14。「15 億」マーク。
- 2,000,000,000 = 2033-05-18。最初の 20 億秒の日付。
- 2038 年問題:32 ビット符号付き整数は 2,147,483,647 でオーバーフローし、2038-01-19 03:14:07 UTC となります。その後、32 ビット Unix タイムスタンプは負の値にラップアラウンドします。
正確な換算公式
タイムスタンプから人間可読日付へ
``` human_date = epoch + タイムスタンプ秒(UTC) local_date = human_date をローカルタイムゾーンに変換 ```
ほとんどのプログラミング言語で:
```python import datetime ts = 1700000000 utc = datetime.datetime.fromtimestamp(ts, tz=datetime.timezone.utc) # 2023-11-14 22:13:20+00:00 local = datetime.datetime.fromtimestamp(ts) # システムのタイムゾーンに依存 ```
```js const ts = 1700000000; const date = new Date(ts * 1000); // JS はミリ秒を使用 // 2023-11-14T22:13:20.000Z ```
人間可読日付からタイムスタンプへ
``` timestamp = (date - epoch) の秒数 ```
```python import datetime d = datetime.datetime(2023, 11, 14, 22, 13, 20, tzinfo=datetime.timezone.utc) ts = int(d.timestamp()) # 1700000000 ```
```js const d = new Date("2023-11-14T22:13:20Z"); const ts = Math.floor(d.getTime() / 1000); // 1700000000 ```
一般的なタイムゾーンオフセット(UTC 基準)
タイムスタンプを扱うとき、特定のタイムゾーンで表示する必要がよくあります:
| タイムゾーン | 略称 | オフセット | 例となる都市 | |------------------------------|--------|-----------------|---------------------------| | 協定世界時 | UTC | 0 | ロンドン(冬)、レイキャビク | | 米国東部標準時 | EST | UTC−5 | ニューヨーク(冬) | | 米国東部夏時間 | EDT | UTC−4 | ニューヨーク(夏) | | 太平洋標準時 | PST | UTC−8 | ロサンゼルス(冬) | | 太平洋夏時間 | PDT | UTC−7 | ロサンゼルス(夏) | | 中央ヨーロッパ時間 | CET | UTC+1 | パリ(冬)、ベルリン | | 中央ヨーロッパ夏時間 | CEST | UTC+2 | パリ(夏)、ベルリン | | 日本標準時 | JST | UTC+9 | 東京 | | 中国標準時 | CST | UTC+8 | 北京、上海 | | インド標準時 | IST | UTC+5:30 | ムンバイ、デリー | | オーストラリア東部標準時 | AEST | UTC+10 | シドニー(冬) | | オーストラリア東部夏時間 | AEDT | UTC+11 | シドニー(夏) |
一部の国(インド、中国)は年間を通じて単一のオフセットを使用し、夏時間はありません。
方法 1:UtilBoxx 時間換算ツール(推奨)
ブラウザで Unix タイムスタンプを換算する最も速く、最もプライベートで、最も正確な方法は UtilBoxx 時間換算ツール です。秒とミリ秒の両方をサポートし、任意のタイムゾーンで表示し、対応する ISO 8601 日付、UTC、ローカル時間を表示します。すべてブラウザ内で動作します。サーバーも、アップロードも、ログもなし。
使い方:
- utilboxx.com/ja/tools/unit/time を開く
- Unix タイムスタンプ(秒単位)または日付文字列を入力
- 換算値が即座に表示される
- ワンクリックでタイムゾーンを切り替え
- 結果をコピー
この方法を推奨する理由:
- 100% 無料、登録不要、メールアドレス不要、広告なし
- プライバシー最優先:ブラウザから出ない
- 双方向:タイムスタンプ ↔ 日付の双方向
- マルチタイムゾーン:UTC、ローカルゾーン、または任意のゾーンでタイムスタンプを表示
- ミリ秒対応、JavaScript スタイルのタイムスタンプ用
- ブラウザがあるあらゆるデバイスで動作
時間を Unix タイムスタンプとして保存する API、ログ、データベースを扱うなら、このツールは最初の週で元が取れます。
方法 2:Python(datetime モジュール)
Python の `datetime` モジュールはタイムスタンプ換算の正規ツールです。2 つの重要な関数は `fromtimestamp()` と `timestamp()` です。
```python import datetime from zoneinfo import ZoneInfo
# タイムスタンプを日付に変換(UTC) ts = 1700000000 utc_date = datetime.datetime.fromtimestamp(ts, tz=datetime.timezone.utc) # 2023-11-14 22:13:20+00:00
# タイムスタンプを特定のタイムゾーンの日付に変換 ny_tz = ZoneInfo("America/New_York") ny_date = datetime.datetime.fromtimestamp(ts, tz=ny_tz) # 2023-11-14 17:13:20-05:00
# 日付をタイムスタンプに変換 d = datetime.datetime(2023, 11, 14, 22, 13, 20, tzinfo=datetime.timezone.utc) ts = int(d.timestamp()) # 1700000000
# 現在:現在のタイムスタンプ now_ts = int(datetime.datetime.now(tz=datetime.timezone.utc).timestamp())
# 日付を ISO 8601 としてフォーマット print(utc_date.isoformat()) # 2023-11-14T22:13:20+00:00 ```
Python 3.9+ にはよりシンプルな `datetime.fromtimestamp(ts, tz=UTC)` 形式もあり、`zoneinfo` モジュール(古い `pytz` を置き換え)がタイムゾーン処理を容易にします。
方法 3:Bash / コマンドライン
macOS と Linux の `date` コマンドは Unix タイムスタンプを解析も出力もできます。
```bash # Unix タイムスタンプを人間が読める日付に変換(macOS / BSD) date -r 1700000000 # Tue Nov 14 22:13:20 UTC 2023
# Unix タイムスタンプを変換(Linux / GNU date) date -d @1700000000 # Tue Nov 14 22:13:20 UTC 2023
# 現在の Unix タイムスタンプを取得 date +%s # 1700000000(または現在値)
# 日付文字列を Unix タイムスタンプに変換(GNU) date -d "2023-11-14 22:13:20 UTC" +%s # 1700000000
# 日付文字列を Unix タイムスタンプに変換(macOS) date -j -f "%Y-%m-%d %H:%M:%S" "2023-11-14 22:13:20" +%s # 1700000000
# 特定のタイムゾーンで表示 TZ="America/New_York" date -d @1700000000 # Tue Nov 14 17:13:20 EST 2023 ```
macOS と Linux で構文が異なります。macOS では `-r` がタイムスタンプを読み取ります。Linux では `-d @...` がタイムスタンプを読み取り、`-d "..."` が日付を解析します。スクリプト作成には GNU 形式(Linux)の方がフレンドリー。macOS 形式はより面倒ですが動作します。
方法 4:JavaScript(ブラウザまたは Node.js)
JavaScript は Unix タイムスタンプにミリ秒を使用し、秒ではありません。秒からミリ秒に変換するには 1,000 を掛けます。
```js // 現在のタイムスタンプ(ミリ秒) const now = Date.now(); // 例:1700000000000
// 秒をミリ秒に変換して Date を作成 const ts = 1700000000; const date = new Date(ts * 1000); // 2023-11-14T22:13:20.000Z
// Intl を使って特定のタイムゾーンで表示 console.log(date.toLocaleString("en-US", { timeZone: "America/New_York" })); // 11/14/2023, 5:13:20 PM
// ISO 8601 として表示 console.log(date.toISOString()); // 2023-11-14T22:13:20.000Z
// 日付をタイムスタンプ(秒)に変換 const d = new Date("2023-11-14T22:13:20Z"); const ts2 = Math.floor(d.getTime() / 1000); // 1700000000
// さまざまな形式を解析 new Date("2023-11-14"); // UTC 真夜中 new Date("2023-11-14T22:13:20Z"); // 22:13:20 UTC new Date(1700000000 * 1000); // ミリ秒から new Date("Nov 14, 2023 22:13:20");// ロケール依存の解析(避ける!) ```
JavaScript の `Date` オブジェクトは有名なほど風変わりです。本格的な作業には `date-fns`、`Luxon`、`Day.js` のようなライブラリを使用してください。迅速な換算には組み込みの `Date` で十分です。
よくある質問
なぜ Unix エポックは 1970 年 1 月 1 日なのか?
Unix オペレーティングシステムが最初に実装された日付です。Ken Thompson と Dennis Ritchie は 1969-1970 年にベル研究所で Unix を設計する際に任意に選びました。天文学的または数学的な理由はありません。彼らが作業していた 10 年の始まりにすぎません。他のいくつかのシステムは異なるエポックを選んでいます:Windows FILETIME は 1601 年 1 月 1 日を使用。macOS HFS+ は 1904 年 1 月 1 日を使用。GPS は 1980 年 1 月 6 日を使用します。
2038 年問題とは何ですか?
2038 年問題(Y2K38 とも呼ばれます)は 2038 年 1 月 19 日 UTC 03:14:07 に発生する 32 ビット符号付き整数のオーバーフローです。32 ビット符号付き整数は最大 2,147,483,647 まで保持できます。1 秒後、オーバーフローして −2,147,483,648 になり、これは 1901-12-13 20:45:52 UTC として解釈されます。32 ビット Unix タイムスタンプを使い続けるシステム(主に組み込みデバイス、古いデータベース、一部のファイルシステム)は更新されなければ壊れます。
修正は簡単です:64 ビット整数に切り替えれば、Unix タイムスタンプの範囲が 2900 億年延びます。ほとんどの現代システムはすでにこれを行っています。問題は主にレガシーと組み込みシステムです。
Unix タイムスタンプは秒とミリ秒のどちらですか?
言語によって異なります:
- 秒:C、Python、Go、Rust、Java(伝統的に)、shell、SQL
- ミリ秒:JavaScript、Java(java.time.Instant)、一部のデータベース
JavaScript がミリ秒を使う主な異端者で、JavaScript のコードが他の言語のコードと混在するときにバグを引き起こします。常に単位を明確にしてください。UtilBoxx 換算ツールは単一のトグルで両方を処理します。
閏秒は Unix タイムスタンプにどう影響しますか?
厳密に言えば、Unix タイムスタンプは閏秒を無視します。毎日が正確に 86,400 秒であるかのように秒を数えます。現実世界の UTC には時折閏秒がありますが(原子時間と地球の自転を一致させるために追加される)、Unix 時間には含まれません。これは、Unix 時間が数年ごとに UTC から数分の一秒ずつ徐々にドリフトすることを意味します。
実際には、これがアプリケーションコードに影響することはほとんどありません。NTP(ネットワーク時刻プロトコル)がこの不一致を処理します。厳密な TAI や原子時間が必要な場合は、Unix タイムスタンプは適切なツールではありません。
"ISO 8601"とは何ですか?
ISO 8601 は、曖昧さがなく機械可読な日付と時刻の形式を設計した国際規格です。例:
- `2023-11-14`(日付のみ)
- `2023-11-14T22:13:20`(日付と時刻、タイムゾーンなし)
- `2023-11-14T22:13:20Z`(UTC、"Z" は "Zulu time")
- `2023-11-14T22:13:20+05:00`(タイムゾーンオフセット付き)
- `2023-11-14T22:13:20.123Z`(ミリ秒付き)
- `20231114T221320Z`(コンパクト形式、区切りなし)
ISO 8601 は、辞書順でソートでき、曖昧さなく解析できるため、日付/時刻値を保存・交換するための推奨形式です。ほとんどの API で使用されています。
現在の Unix タイムスタンプを取得するには?
すべての主要言語で:
```bash # bash date +%s ```
```python import time time.time() # 1700000000.123(浮動小数点、小数秒付き) int(time.time()) # 1700000000(整数秒) ```
```js Date.now() / 1000 // 1700000000.123 Math.floor(Date.now() / 1000) // 1700000000 ```
まとめ
Unix タイムスタンプはコンピューティングにおける時間の普遍言語です。これらは単純な整数で、比較、格納が容易で、タイムゾーンに依存しません。エポックは 1970 年 1 月 1 日で、タイムスタンプはそこから秒単位で数えます。
たまに換算するなら、UtilBoxx 時間換算ツール はプライベートで、無料で、読み込み後はオフラインで動作します。バッチやスクリプト作業には Python の `datetime` または bash の `date` コマンドが任意のデータ量を処理できます。対話的な作業には、JavaScript の `Date` がすべてのブラウザに組み込まれています。
暗算の近道:1,000,000,000 = 2001(Unix 10 億秒)、1,500,000,000 = 2017、2,000,000,000 = 2033。これらのアンカーがあれば、任意の 10 桁のタイムスタンプの年を頭の中で推定できます。そして覚えておいてください:12 年後に 2038 年問題がやってくるので、今すぐ 32 ビットタイムスタンプを監査してください。