HTML で使われる日付や時刻の形式
==================

一部の HTML 要素は日付や時刻の値を使用します。この記事ではこれらの値を指定する文字列の形式について説明しています。

このような形式を使用する要素には、ユーザーに日付、時刻、またはその両方を選択または指定させる `<input>` 要素の一部の形、同様に `<ins>` および `<del>` 要素で、`datetime` 属性によって内容の挿入または削除が行われた日付や日時を指定しているものなどがあります。

`<input>` については、 `type` の値のうち日付や時刻を表す文字列を含む `value` を返すものは次の通りです。

* `date`
* `datetime-local`
* `month`
* `time`
* `week`
例
-

日付と時刻文字列が HTML でどのように記述され解析されるかの複雑さを理解する前に、より一般的に使用される日付と時刻文字列形式がどのように見えるかを理解するための例をいくつか示します。

HTML の日付と時刻文字列の例| 文字列 | 日付または時刻 |
| --- | --- |
| `2005-06-07` | 2005 年 6 月 7 日 | [詳細] |
| `08:45` | 午前 8 時 45 分 | [詳細] |
| `08:45:25` | 午前 8 時 45 分 25 秒 | [詳細] |
| `0033-08-04T03:40` | 33 年 8 月 4 日午前 3 時 40 分 | [詳細] |
| `1977-04-01T14:00:30` | 1977 年 4 月 1 日午後 2 時 30 秒 | [詳細] |
| `1901-01-01T00:00Z` | UTC での 1901 年 1 月 1 日の夜半 | [詳細] |
| `1901-01-01T00:00:01-04:00` | 米東部標準時の 1901 年 1 月 1 日の夜半から 1 秒後 | [詳細] |

基本
--

HTML 要素で使用される文字列に関する日付や時刻のさまざまな形式を見てみる前に、これらの定義方法についての基本的な事実をいくつか理解してしておくと有用です。HTML では、日付や時刻文字列に ISO 8601 標準の一種を使用します。HTML 仕様書には、実際に ISO 8601 よりも詳細に文字列を解析するアルゴリズムが含まれており、日付と時刻の外見について微妙な違いがある可能性があるので、文字列が実際に HTML と互換性があることを確認するためには、使用している形式の説明を確認する価値があります。

### 文字セット

HTML において、日付と時刻は常に ASCII 文字セットを使用した文字列です。

### 年

HTML で日付文字列に使われる基本的な形式を単純化するために、仕様書ではすべての年をグレゴリオ暦（または**先発グレゴリオ暦**）を使用して指定することを要求しています。ユーザーインターフェイスは他のカレンダーを使用した日付を入力することもできますが、元となる値は常にグレゴリオ暦を使用します。

グレゴリオ暦は（よく似たユリウス暦を置き換えた）1582 年まで作成されていませんでしたが、 HTML の目的上、グレゴリオ暦は紀元 1 年まで延長されています。古い日付については、それを考慮してください。

HTML の日付の目的上、年は常に 4 桁以上の長さになります。1000 年より前の年は、先頭にゼロ ("`0`") を入れますので、72 年は `0072` と書かれます。紀元 1 年以前の年には対応していないので、 HTML は紀元前 1 年以前の年に対応していません。

1 年はふつうは 365 日ですが、**うるう年** は例外です。

#### うるう年

**うるう年**は 400 で割れる年、または 4 で割れる年で 100 で割れない年です。暦年の長さは通常 365 日ですが、実際には地球が太陽の周りを一周するのにおよそ 365.2422 日かかります。うるう年は、惑星の軌道上の実際の位置に合わせてカレンダーを調整するのに役立ちます。4 年ごとに 1 日を加えると、平均的な 1 年の長さは 365.25 日になり、これはほぼ正確に近くなります。

アルゴリズムの調整（年を 400 で割ることができる場合はうるう年とし、年を 100 で割ることができる場合はうるう年としない）は、平均をさらに正しい日数（365.2425 日）に近づけるのに役立ちます。科学者たちは、残りの 1 万分の 3 日を処理し、地球の自転が自然に徐々に遅くなるのを補うために、閏秒をカレンダーに追加することがあります（真面目な話）。

`02` の月、すなわち 2 月は通常 28 日ですが、うるう年には 29 日になります。

### 月

1 年には 12 ヶ月があり、1 から 12 まで番号が振られています。これらは常に 2 桁の ASCII 文字列、 `01` から `12` の範囲で表現されます。日の節にある表で、対応する名前を（と日数）を確認してください。

### 日付

1, 3, 5, 7, 8, 10, 12 月は 31 日あります。 4, 6, 9, 11 月は 30 日あります。 2 月は多くの年では 28 日ですが、うるう年には 29 日になります。これは下記の表で詳しく説明しています。

月とその日数| 月番号 | 名前（英語） | 日数 |
| --- | --- | --- |
| 01 | January | 31 |
| 02 | February | 28（うるう年では 29） |
| 03 | March | 31 |
| 04 | April | 30 |
| 05 | May | 31 |
| 06 | June | 30 |
| 07 | July | 31 |
| 08 | August | 31 |
| 09 | September | 30 |
| 10 | October | 31 |
| 11 | November | 30 |
| 12 | December | 31 |

週文字列
----

週文字列は、特定の年の中の 1 週間を指定します。**有効な週文字列**は、有効な年、ハイフン文字 ("`-`", U+002D)、大文字の "`W`" (U+0057)、2 桁の週が続きます。

年の週は、`01` から `53` の間の 2 桁文字列です。各週は月曜日から始まり、日曜日に終わります。つまり、1 月の最初の数日間は直前の週と同じとみなし、12 月の最後の数日間を直後の週と同じとみなすことが可能です。年の最初の週は、*その年の最初の木曜日* がある週です。例えば、1953 年の最初の木曜日は 1 月 1 日だったので、12 月 29 日（月）から始まる週がその年の最初の週とみなされます。したがって、1952 年 12 月 30 日は `1953-W01` の週となります。

以下の場合、1 年は 53 週となります。

* 暦年の最初の日（1 月 1 日）が木曜日であること、**または**
* 1 年の最初の日（1 月 1 日）が水曜日で、その年がうるう年であること。

他の年はすべて 52 週です。

| 週文字列 | 年と週（日付の範囲） |
| --- | --- |
| `2001-W37` | 2001 年第 37 週（2001 年 9 月 10～16 日） |
| `1953-W01` | 1953 年第 1 週（1952 年 12 月 29 日～1953 年 1 月 4 日） |
| `1948-W53` | 1948 年第 53 週（1948 年 12 月 27 日～1948 年 1 月 2 日） |
| `1949-W01` | 1949 年第 1 週（1949 年 1 月 3～9 日） |
| `0531-W16` | 531 年第 16 週（531 年 4 月 13～19 日） |
| `0042-W04` | 42 年第 4 週（42 年 1 月 21～27 日） |

なお、年と週番号の両方に先頭のゼロを入れ、年は 4 桁、週は 2 桁になるようにパディングされます。

月文字列
----

月文字列は、その年の一般的な月ではなく、時刻の中の特定の月を表します。つまり、HTML の月文字列は、「1 月」を表すのではなく、「1972 年 1 月」のように年と月が対になっているものを表します。

**有効な月文字列**は、有効な年（4 桁以上の文字列）にハイフン ("`-`", U+002D) が続き、2 桁の数字の月からなり、`01` は 1 月を、`12` は 12 月を表します。

| 月文字列 | 年月 |
| --- | --- |
| `17310-09` | 17310 年 9 月 |
| `2019-01` | 2019 年 1 月 |
| `1993-11` | 1993 年 11 月 |
| `0571-04` | 571 年 4 月 |
| `0001-07` | 紀元 1 年 7 月 |

年はすべて 4 文字以上であることに注意してください。4 桁未満の年は、先頭がゼロでパディングされます。

日付文字列
-----

有効な日付文字列は、月文字列、ハイフン文字 ("`-`", U+002D)、2 桁の日付が続きます。

| 月文字列 | 日付全体 |
| --- | --- |
| `1993-11-01` | 1993 年 11 月 1 日 |
| `1066-10-14` | 1066 年 10 月 14 日 |
| `0571-04-22` | 571 年 4 月 22 日 |
| `0062-02-05` | 62 年 2 月 5 日 |

時刻文字列
-----

時刻文字列は、分、秒、ミリ秒のいずれかの精度で時刻を指定することができます。時や分だけを指定することはできません。**有効な時刻文字列**は、最小で 2 桁の「時」にコロン ("`:`", U+003A) が続き、次に 2 桁の「分」で構成されています。分の値には、オプションで、さらにコロンと 2 桁の秒数が続くことがあります。ミリ秒は、オプションで、小数点文字 ("`.`", U+002E) の後に 1 桁、2 桁、3 桁を続けて指定することができます。

さらに基本的なルールがいくつかあります。

* 時は常に 24 時間制を使用して指定し、`00` が午前 0 時、午後 11 時が `23` となります。`00` ～ `23` の範囲外の値は許可されません。
* 分は `00` から `59` の間の 2 桁の数字でなければなりません。その範囲外の値は許可されません。
* 秒を省略した場合（分単位で正確な時刻を指定する場合）、分の値の後にコロンをつけてはいけません。
* 指定する場合、秒数の整数部分は `00` から `59` の間でなければなりません。`60` や `61` のような値を用いてうるう秒を指定することはできません。
* 秒を指定し、それが整数である場合、その後に小数点以下を続けてはいけません。
* 2 秒の小数部を記述する場合は、1 桁から 3 桁の長さで、ミリ秒の数を示すことができます。時刻文字列の秒成分の後に小数点に続いて指定します。

| 時刻文字列 | 時刻 |
| --- | --- |
| `00:00:30.75` | 午前 12:00:30.75（真夜中から 30.75 ） |
| `12:15` | 午後 12:15 |
| `13:44:25` | 午後 1:44:25（午後 1:44 から 25 秒後） |

ローカル日時文字列
---------

有効な `datetime-local` 文字列は、`date` 文字列と `time` 文字列を文字 "`T`" または空白文字で区切って結合したものです。 文字列にはタイムゾーンの情報は含まれず、日付と時刻はユーザーのローカルタイムゾーンにあると推定されます。

`datetime-local` 入力欄の `value` を設定すると、文字列が**正規化**されます。正規化された `datetime` 文字列は常に文字 "`T`" を使用して日付と時刻を区切り、時刻の部分はできるだけ短くなるようにします。これは、秒成分の値が`:00`の場合、秒成分を省くことで実現されます。


 有効な
 `datetime-local`
 文字列の例
 | 日時文字列 | 正規化された日時文字列 | 実際の日付と時刻 |
| --- | --- | --- |
| `1986-01-28T11:38:00.01` | `1986-01-28T11:38:00.01` | 1986 年 1 月 20 日午前 11 時 30 分 0.01 秒 |
| `1986-01-28 11:38:00.010` | `1986-01-28T11:38:00.01`
正規化後は、一つ前の `datetime-local` と同じ文字列となることに注意してください。空白文字は "`T`" に置き換えられ、秒の小数部の末尾の 0 を削除して、文字列ができるだけ短くなるようになります。 | 1986 年 1 月 20 日午前 11 時 30 分 0.01 秒 |
| `0170-07-31T22:00:00` | `0170-07-31T22:00`
この日付の正規化形式では、秒が 0 であることを示す "`:00`" がないことに注意してください。秒はゼロの場合に省略可能で、正規化された文字列は長さが最小になるからです。 | 170 年 7 月 31 日午後 10 時ちょうど |

グローバル日時文字列
----------

グローバル日時文字列は、日付と時刻、およびその時刻が発生するタイムゾーンを指定するものです。**有効なグローバル日時文字列**は、末尾に時刻に続いてタイムゾーン文字列が続くことを除けば、ローカル日時文字列と同じ形式です。

### タイムゾーンオフセット文字列

タイムゾーンオフセット文字列は、標準時からのオフセットを正の値または負の値で指定します。標準時のベースは 2 つあり、とても似通っているのですが、全く同じではありません。

* 1960 年代初頭に協定世界時 (UTC) が制定された以降の日付については、タイムベースは `Z`、オフセットは経度 0° の本初子午線（イギリス、グリニッジの王立天文台を通過）の時刻からの具体的なタイムゾーンへのオフセットを示します。
* UTC 以前の日付の場合、タイムベースは代わりに UT1 で表現されていました。これは、同じ本初子午線における現代の地球の太陽時です。

タイムゾーン文字列は、日時文字列の時刻の直後に付加されます。タイムゾーンオフセット文字列として "`Z`" を指定すると、時刻を UTC で指定することを示すことができます。それ以外の場合、タイムゾーン文字列は以下のように構成されます。

1. オフセットの符号を示す文字: 本初子午線より東側の時間帯はプラス文字 ("`+`"、または U+002B)、本初子午線より西側の時間帯はマイナス文字 ("`-`"、または U+002D) です。
2. その時刻が本初子午線から何時間ずれているかを示す 2 桁の数字。
3. オプションのコロン ("`:`") 文字。
4. 2 桁の時から経過した分の値。この値は `00` から `59` の間である必要があります。

この形式では -23:59 から +23:59 までのタイムゾーンを許容していますが、現在のタイムゾーンのオフセットの範囲は -12:00 から +14:00 であり、現在、正時から `00`、`30`、`45` 以外のオフセットを持つタイムゾーンはありません。これは、国がいつでも自由にタイムゾーンを変更することができるため、いくつか変更される可能性があります。

有効なグローバル日時文字列の例| グローバル日時文字列 | 実際のグローバル日時 | 本初子午線上の日時 |
| --- | --- | --- |
| `2005-06-07T00:00Z` | 2005 年 7 月 7 日真夜中 (UTC) | 2005 年 7 月 7 日真夜中 |
| `1789-08-22T12:30:00.1-04:00` | 1789 年 8 月 22 日午後 12 時 30 分から 0.1 秒後（東部夏時間） | 1789 年 8 月 22 日午後 4 時 30 分から 0.1 秒後 |
| `3755-01-01 00:00+10:00` | 3755 年 1 月 1 日真夜中（オーストラリア東部標準時） | 3754 年 12 月 31 日午後 2:00 |

関連情報
----

* `<input>`
* `<ins>` および `<del>`: datetime`属性を参照してください。この属性は、コンテンツが挿入または削除された日付またはローカル日時を指定します。
* The ISO 8601 specification
* 数値と日付 (JavaScript ガイド)
* JavaScript の `Date` オブジェクト
* `Intl.DateTimeFormat` オブジェクト（指定されたロケールで日時を書式化）