「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時間)
  • キャッシュ TTLPT5M(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 タイムスタンプ変換ツール をぜひ活用してください。