「2026/04/04」「April 4, 2026」「04-04-2026」——日付の書き方は国や文化によって異なります。この曖昧さを解消するために生まれた国際規格が ISO 8601 です。
本記事では、ISO 8601 の基本構文から、タイムゾーン表記・期間・繰り返しの書き方、プログラミングでの活用方法まで、実例を交えて徹底解説します。
ISO 8601 とは?
ISO 8601 は、国際標準化機構(ISO)が制定した 日付と時刻の表記に関する国際規格 です。1988年に初版が公開され、現在は 2019年版が最新です。
この規格の最大の目的は 「日付の曖昧さをなくすこと」 です。たとえば「04/05/26」という表記は、日本では「2026年4月5日」、アメリカでは「2026年5月4日」、ヨーロッパでは「2026年5月26日の省略形」と解釈される可能性があります。ISO 8601 を使うと、この種の混乱がなくなります。
ISO 8601 が使われる主な場面
- API レスポンス:REST API や JSON の日時フィールド
- データベース:MySQL・PostgreSQL の DATETIME 型
- ファイル名・ログ:ソート可能な日付形式として
- HTML の <time> 要素:datetime 属性
- カレンダーアプリ:iCal(.ics)形式
- Git コミット・CI/CD:タイムスタンプの標準形式
基本フォーマット:日付・時刻・日時
日付の表記
ISO 8601 の日付は 年・月・日を大きい順 に並べます。
# 拡張形式(ハイフン区切り)— 最も一般的 2026-04-04 # 基本形式(区切りなし) 20260404 # 年・月のみ 2026-04 # 年のみ 2026
桁数は固定です。年は4桁、月・日はゼロ埋めで必ず2桁(例:4月 → 04)。
時刻の表記
# 時:分:秒(拡張形式) 14:30:00 # 秒以下(小数点またはカンマ) 14:30:00.500 ← 500ミリ秒 14:30:00,500 ← カンマも許容 # 基本形式 143000
日時の組み合わせ(最重要)
日付と時刻を組み合わせるときは T をセパレータ として使います。
2026-04-04T14:30:00 # ミリ秒あり 2026-04-04T14:30:00.500 # タイムゾーンあり(次のセクションで詳述) 2026-04-04T14:30:00Z 2026-04-04T14:30:00+09:00
この T 区切りの形式は RFC 3339(インターネット向けの派生仕様)でも採用されており、多くのプログラミング言語・フレームワークのデフォルト出力形式になっています。
タイムゾーンの表記:Z と ±HH:MM
ISO 8601 では、日時にタイムゾーン情報を付加できます。この指定がないと「ローカル時刻(タイムゾーン不明)」とみなされるため、API 設計では 必ずタイムゾーンを含めることが推奨 されます。
UTC(協定世界時)
2026-04-04T14:30:00Z
末尾の Z は "Zulu time"(ズールー時間)の略で、UTC(オフセット +00:00)を意味します。
UTC オフセット
# 日本標準時(JST = UTC+9) 2026-04-04T23:30:00+09:00 # 米国東部夏時間(EDT = UTC-4) 2026-04-04T10:30:00-04:00 # インド標準時(IST = UTC+5:30) 2026-04-04T20:00:00+05:30
+09:00 の部分が UTC からの差分 です。「UTC より9時間進んでいる」という意味になります。
Z と +00:00 の違い
技術的には同じ時刻を指しますが、使い分けの慣習があります:
- Z:システム間通信・ログ・API レスポンスでよく使われる簡潔な表記
- +00:00:ロンドン時間(夏時間なし)を明示したい場合など
多くのフレームワークは Z を出力します(JavaScript の toISOString() など)。
週番号・序数日付
ISO 8601 は年月日以外の日付表現もサポートしています。
週番号(ISO Week Date)
# 形式:YYYY-Www-D(W=Week, D=曜日 1=月〜7=日) 2026-W14-6 ← 2026年の第14週・土曜日 # 週のみ 2026-W14
ISO の週 は月曜始まりで、年の最初の木曜日を含む週が第1週(W01)と定義されます。年末年始は前後の年の週番号になることがあります。
序数日付(Ordinal Date)
# 形式:YYYY-DDD(DDD = 年通算日数) 2026-094 ← 2026年の94日目(= 4月4日)
ログ処理や天文計算など、「その年の何日目か」を扱う場面で便利です。
期間(Duration)の表記
ISO 8601 は 時間の長さ(持続期間)の表記規格も定めています。形式は P から始まります。
# 基本構文 P[年Y][月M][週W][日D]T[時H][分M][秒S] # 例 P1Y ← 1年 P3M ← 3ヶ月 P7D ← 7日 PT2H30M ← 2時間30分 P1Y2M3DT4H5M ← 1年2ヶ月3日4時間5分 PT30S ← 30秒
T は日付部分と時刻部分の区切りです。時刻要素(H/M/S)を含む場合は T が必要です。
実用例
- JWT の有効期限:
PT1H(1時間) - キャッシュ TTL:
PT5M(5分) - HTML <video> duration 属性:
PT1M30S(1分30秒) - iCal DURATION プロパティ:
P1D(1日)
時間区間(Interval)と繰り返し(Repeating Interval)
時間区間
開始と終了で期間を表すことができます。
# 開始日時/終了日時 2026-04-01T00:00:00Z/2026-04-30T23:59:59Z # 開始日時/期間 2026-04-01T00:00:00Z/P1M # 期間/終了日時 P1M/2026-04-30T23:59:59Z
繰り返し
# 形式:R[回数]/[区間] R5/2026-04-04T09:00:00Z/PT1H ← 2026-04-04 09:00 UTC から 1時間ごとに5回 R/2026-04-04T09:00:00Z/P1W ← 無限に毎週繰り返し(R のみ = 無限)
プログラミング言語での ISO 8601
JavaScript / TypeScript
// 現在日時を ISO 8601(UTC)で取得
const now = new Date().toISOString();
// → "2026-04-04T14:30:00.000Z"
// ISO 8601 文字列からパース
const date = new Date("2026-04-04T14:30:00+09:00");
// Intl.DateTimeFormat でローカル表示
const formatter = new Intl.DateTimeFormat('ja-JP', {
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
timeZone: 'Asia/Tokyo'
});
console.log(formatter.format(date));
Python
from datetime import datetime, timezone, timedelta
# 現在の UTC 時刻(ISO 8601)
now_utc = datetime.now(timezone.utc)
print(now_utc.isoformat())
# → "2026-04-04T14:30:00.000000+00:00"
# JST で出力
jst = timezone(timedelta(hours=9))
now_jst = datetime.now(jst)
print(now_jst.isoformat())
# → "2026-04-04T23:30:00.000000+09:00"
# Python 3.7+ : fromisoformat でパース
dt = datetime.fromisoformat("2026-04-04T14:30:00+09:00")
# Python 3.11+ : Z サフィックスも対応
dt = datetime.fromisoformat("2026-04-04T14:30:00Z")
PHP
format(DateTime::ATOM);
// → "2026-04-04T14:30:00+00:00"
// ISO 8601 からパース
$dt = new DateTime("2026-04-04T14:30:00+09:00");
// Carbon(Laravelでの一般的な使い方)
$now = Carbon\Carbon::now('Asia/Tokyo')->toIso8601String();
?>
SQL(MySQL / PostgreSQL)
-- MySQL: ISO 8601 形式で現在日時取得 SELECT DATE_FORMAT(NOW(), '%Y-%m-%dT%H:%i:%sZ') AS iso8601; -- PostgreSQL: ISO 8601 + タイムゾーン SELECT NOW()::timestamptz AT TIME ZONE 'UTC'; -- または SELECT to_char(NOW() AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"');
HTML での使い方:<time> 要素
HTML5 の <time> 要素では、機械可読な日時を datetime 属性で ISO 8601 形式で指定します。これにより、検索エンジンやスクリーンリーダーが正確に日時を解釈できます。
<!-- 日付のみ --> <time datetime="2026-04-04">2026年4月4日</time> <!-- 日時(タイムゾーンあり) --> <time datetime="2026-04-04T14:30:00+09:00">2026年4月4日 14:30 JST</time> <!-- ブログ記事の公開日 --> <article> <h1>記事タイトル</h1> <p>公開日:<time datetime="2026-04-04" pubdate>2026年4月4日</time></p> </article>
Google の構造化データ(Schema.org)でも ISO 8601 が推奨されています:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"datePublished": "2026-04-04T09:00:00+09:00",
"dateModified": "2026-04-04T12:00:00+09:00"
}
</script>
よくある間違いと注意点
① タイムゾーンなし問題
# NG:タイムゾーン不明(どの地域の14:30か不明) 2026-04-04T14:30:00 # OK:UTC 明示 2026-04-04T14:30:00Z # OK:JST 明示 2026-04-04T14:30:00+09:00
API やデータベース間でデータをやり取りする場合は、必ず UTC または UTC オフセットを付加してください。「サーバーがどのタイムゾーンで動いているかわからない」という問題を防ぎます。
② 区切り文字の混在
# NG:スラッシュ・スペース区切りは ISO 8601 ではない 2026/04/04 14:30:00 # OK 2026-04-04T14:30:00
③ 年月日の順序逆転
# NG(アメリカ式) 04-04-2026 # OK(ISO 8601 は大きい順) 2026-04-04
④ 月・日のゼロ埋め忘れ
# NG 2026-4-4 # OK 2026-04-04
よくある質問
Q. ISO 8601 と RFC 3339 の違いは?
RFC 3339 は ISO 8601 のサブセットで、インターネットプロトコル向けに制約を加えたものです。主な違いは「T の代わりにスペースを許容しない」「タイムゾーン省略不可」など。実用上は両者はほぼ同じと考えて構いません。多くの API 仕様では "RFC 3339 / ISO 8601" とまとめて記載されます。
Q. UTC+9 と JST はどう違う?
JST(Japan Standard Time)は「日本標準時」というタイムゾーン名称です。UTC+9 はそのオフセット値。ISO 8601 ではタイムゾーン名(JST)は使えず、オフセット値(+09:00)または Z を使います。
Q. JavaScript の Date は ISO 8601 をパースできる?
基本的にはできますが、タイムゾーンなしの日付文字列(2026-04-04)は UTC 00:00 として扱われる実装と、ローカル時刻として扱われる実装が混在しています。確実にローカル時刻として扱うには 2026-04-04T00:00:00(T区切り形式)を使うか、date-fns・Day.js・Luxon などのライブラリを使うのが安全です。
Q. 日時フォーマットを手軽に変換したい
Devryo の日付フォーマット変換ツールを使えば、ISO 8601・RFC 2822・Unix タイムスタンプ・人間可読形式など9種類への変換が一瞬でできます。
まとめ
ISO 8601 は「日付・時刻の国際共通語」です。APIやデータベース設計で使うときは、次の3点を押さえておけば基本は完璧です:
- 形式:
YYYY-MM-DDTHH:mm:ss(T区切り、ゼロ埋め) - タイムゾーン:必ず Z または ±HH:MM を付ける
- 順序:年 → 月 → 日 → 時 → 分 → 秒(大きい順)
日付フォーマットの変換が必要なときは、日付フォーマット変換ツール や Unix タイムスタンプ変換ツール をぜひ活用してください。