parse a date string

日時形式 (HTML)

[7] HTML ではいくつかの属性などで日時を表す文字列が用いられています。 そのほとんどは ISO 8601の日付形式に近いものですが、歴史的な理由により異なる書式を採用している文脈もあります。

[93] HTML で定義されている日付形式には、次のものがあります。

[149] マイクロデータの日時形式OGPの日時形式も参照してください。

[150] HTML ではこれらの日時形式が定義されていますが、 これはあくまでそれぞれの文脈で用いられるべき構文に過ぎません。 通常の要素内容や自由文が認められる属性などで人間向け、 あるいは著者によるスクリプトのために記述される日時は、 任意の構文で記述して構いません。

[151] 例えば文章の一部としての日付の記述は従来各自然言語や組織等で慣習的に用いられてきた表記方法をそのまま使って構いません。 また JavaScript での処理のために data-* 属性に設定する場合は Unix time など処理しやすい形式でも構いません。

仕様書

[51] 本項では HTML5 の定義に基づき説明しますが、 構文の定義や算法の定義は必ずしも仕様書の通りではありません。仕様書の規定と等価な別な表現で説明していることがあります。

定義

[94] HTML日付形式の定義のために、次のような概念も定義しています。

時刻

[20] 時刻 (time) は、特定の時刻を表し、 秒の小数部から成ります。時間帯の情報は持ちません。 HTML5

構文定義

  1. 2数字
  2. :
  3. 2数字
  4. ?
    1. :
    2. 2数字
    3. ?
      1. .
      2. +
        1. 数字

最短形

[104] 妥当な正規化済み地方日時文字列妥当な正規化済みUTC大域日時文字列では、 妥当な時刻文字列の最短形を使うことになっています。これはすなわち、

[148] <input type=time> で単独で妥当な時刻文字列として使われる場合には、 最短形であることは要求されていないようです。

構文解析

[23] 時刻文字列の構文解析 (parse a time string) HTML5:

  1. 時刻部品の構文解析を行い、それが何も返さなかったら、何も返さないで終える
  2. 文字列がそれで終わっていなければ、何も返さないで終える
  3. (1) で得られたを返す

[24] 時刻部品の構文解析 (parse a time component) HTML5:

  1. 文字列正規表現 (数字{2}):(数字{2})(?::(数字{2}(?:\.数字+)?))?一致しない場合、何も返さず終わる
  2. $1 を十進数として解釈したものをとする
  3. $2 を十進数として解釈したものをとする
  4. $3 を十進数として解釈したものをとする ($3 がない場合、 0 とする)
  5. が 0〜23 でない場合、何も返さない
  6. が 0〜59 でない場合、何も返さない
  7. が 60 未満正数でない場合、何も返さない
  8. を返す

数値表現

[63] valueAsNumber DOM属性では、 1970年1月1日0時0分 (UTC) からのミリ秒の数によって表現されます。 HTML5

[64] valueAsDate DOM属性では、 1970年1月1日における時刻 (UTC) とした Date 物体によって表現されます。 HTML5

[65] 時刻を入力する input 要素step 属性では、 時間単位のによって表現されます。 HTML5

文脈

[54] typetimeinput 要素で使われます。

[130] time 要素で使われます。

[131] 妥当な大域日時文字列妥当な地方日時文字列妥当な日付文字列と省略可能な時刻の定義で用いられています。

[132] 時間帯で使われる時分の表記と似ていますが、異なるものとして定義されています。

日付

[16] 日付 (date) は、先発グレゴリオ暦上の日付を表します。 日付にはが含まれますが、時間帯は含まれません。 HTML5

構文

  1. 4以上の数字
  2. -
  3. 2数字
  4. -
  5. 2数字

構文解析

[18] 日付文字列の構文解析 (parse a date string) HTML5:

  1. 日付部品の構文解析を行い、それが何も返さなかったら、何も返さないで終える
  2. 文字列がそれで終わっていなければ、何も返さないで終える
  3. (1) で得られたを返す

[19] 日付部品の構文解析 (parse a date component) HTML5:

  1. 月部品の構文解析により、を得る。何も返されなかった場合、何も返さず終わる
  2. 文字列の続きが正規表現 -(数字{2})一致しない場合、何も返さず終わる
  3. $1 を十進数として解釈したものをとする
  4. に基づくの数 (>>9) 以下正数でなければ、何も返さず終わる
  5. を返す

数値表現

[70] valueAsNumber DOM属性では、 1970年1月1日0時0分 (UTC) からその真夜中 (UTC) までのミリ秒の数によって表現されます。 HTML5

[71] valueAsDate DOM属性では、 その真夜中 (UTC) を表す Date 物体によって表現されます。 HTML5

[72] 日付を入力する input 要素step 属性では、 時間単位のによって表現されます。 HTML5

文脈

[53] typedateinput 要素で使われます。

[126] time 要素で使われます。

[127] autofill の定義で使われます。

[128] 妥当な大域日時文字列妥当な地方日時文字列妥当な日付文字列と省略可能な時刻の一部として使われます。

[129] vCardvEventマイクロデータで使われます。

関連

[45] JavaScript では、 Date オブジェクトtoISODateString メソッドにより取得できます。 (厳密には定義が異なりますが、実用上は無視できる程度の違いです。)

地方日時

[25] 地方日時 (local date and time) は、 先発グレゴリオ暦上の日時を表します。 秒の小数部から成ります。 時間帯の情報は含みません。 HTML5

構文定義

[26] 妥当な地方日時文字列 (valid local date and time string) は、 次のような文字列です >>8

  1. [97] 妥当な日時文字列
  2. |
    1. [98] T
    2. U+0020
  3. [99] 妥当な時刻文字列

[100] 「T」は大文字でなければなりません。
[101] 元は >>98 は「T」だけでしたが、後に緩和されて U+0020 も認められるようになりました。

[102] 妥当な正規化済み地方日時文字列 (valid normalized local date and time string) は、 >>26 のうち、 >>98T であり、 >>99 が最短形のものです >>8

[103] 秒未満は可能な限り短くしなければいけませんし、が0なら部分も省略します。

構文解析

[27] 地方日時文字列の構文解析 (parse a local date and time string) は、 次のように行います >>8

  1. 日付部品の構文解析により、を得る。何も返されなかった場合、 何も返さず終わる
  2. 文字列の次の文字大文字の「T」か U+0020 でない場合、 何も返さず終わる
  3. 時刻部品の構文解析により、を得る。何も返されなかった場合、 何も返さず終わる
  4. 文字列がそれで終わっていなければ、何も返さず終わる
  5. を返す

数値表現

[73] valueAsNumber DOM属性では、 1970年1月1日0時0分からのミリ秒の数によって表現されます。 HTML5

[74] valueAsDate DOM属性での表現は定義されていません。 HTML5

[75] 地方日時を入力する input 要素step 属性では、 時間単位のによって表現されます。 HTML5

文脈

[55] typedatetime-localinput 要素で使われます。

[133] time 要素で使われます。

関連

[146] ISO 8601の日付形式 (>>25)に、類似形式との比較があります。

大域日時

[31] 大域日時 (global date and time) は、 先発グレゴリオ暦上の日時を表します。 秒の小数部時間帯から成ります。 HTML5

構文定義

[32] 妥当な大域日時文字列 (valid global date and time string) は、次のような文字列です >>8

  1. [115] 妥当な日時文字列
  2. [116] TU+0020
  3. [117] 妥当な時刻文字列
  4. [118] 妥当な時差文字列

[119]T」は大文字でなければなりません。
[120] 以前は >>116T のみでしたが、緩和されました。

[121] かつて規定されていた妥当な正規化済みUTC強制大域日時文字列 (valid normalised forced-UTC global date and time string) (>>92 で削除) とは、 次のような文字列です >>8

  1. [122] 妥当な日時文字列 (UTC で表現したもの)
  2. [123] T
  3. [124] 妥当な時刻文字列 (UTC で表現したもので、最短形)
  4. [125] Z

構文解析

[33] 大域日時文字列の構文解析 (parse a global date and time string) HTML5:

  1. 日付部品の構文解析により、を得る。何も返されなかった場合、 何も返さず終わる
  2. 文字列の次の文字大文字の「T」か U+0020 でない場合、 何も返さず終わる
  3. 時刻部品の構文解析により、を得る。何も返されなかった場合、 何も返さず終わる
  4. 時差部品の構文解析により、時間帯を得る。何も返されなかった場合、 何も返さず終わる
  5. 文字列がそれで終わっていなければ、何も返さず終わる
  6. ~を、時間帯の情報を使って UTC に換算する
  7. 時間帯を返す

数値表現

[76] valueAsNumber DOM属性では、 1970年1月1日0時0分 (UTC) からのミリ秒の数によって表現されます。 HTML5

[77] valueAsDate DOM属性では、 UTC におけるその時刻を表す Date 物体によって表現されます。 HTML5

[78] 大域日時を入力する input 要素step 属性では、 時間単位のによって表現されます。 HTML5

文脈

[56] typedatetimeinput 要素で使われます。

[57] ins 要素del 要素datetime 属性で使われます。

[136] time 要素で使われます。

[139] vCard マイクロデータrev の値で使われます。

[138] vEvent マイクロデータcreated, last-modified の値で使われます。

[137] 妥当な日付文字列と省略可能な時刻HTMLの時刻の範囲の形式で使われます。

レンダリング

[140] ins/deldatetime 属性では、指定された時間帯で表示するべきとされています。

関連

[147] ISO 8601の日付形式 (>>25)に、類似形式との比較があります。

[44] JavaScript では、 Date オブジェクトtoISOString メソッドにより取得できます。 (厳密には定義が異なりますが、実用上は無視できる程度の違いです。)

[34] 0037-12-13T00:00Z HTML5

ローマ皇帝ネロ誕生日 (ユリウス暦37年12月15日のグレゴリオ暦換算) の真夜中を表します。なお、 37-12-13が4桁に満たないので、 妥当な大域日時文字列ではありません。

[35] 1979-10-14T12:00:00.001-04:00 HTML5

北米東海岸夏時刻中の1979年10月14日の正午から1ミリ秒後を表します。

[36] 8592-01-01T02:09+02:09 HTML5

将来の時刻です。端数の時間帯は現在地球上では用いられていませんが、 仕様上は認められています。

暦法との関係

過去の日付

[12] HTMLグレゴリオ暦 (だけ) を採用しています。グレゴリオ暦が採用される以前の日付も表すことができますが、 グレゴリオ暦を過去に延長した場合に相当する日付を使って表されます (先発グレゴリオ暦 (proleptic グレゴリオ暦) などと呼ばれます)。

[39] 正数のみを指定できます。0年や負の年は認められていません。

[10] 過去の日時も参照。

将来の日付

[37] 現在の HTML では、の桁数が4桁以上で無制限とされており、1万年問題は存在しません。

[38] 過去の版の HTML5 案や Web Forms 2.0HTML4 ではは4桁に制限されていました。

[11] 将来の日時も参照。

閏年

[95] HTMLの日付形式先発グレゴリオ暦に従って閏年に対応しています。

[96] を含んでいない妥当な月日文字列については、閏年同様2月29日 (--02-29) が認められています。

閏秒

[22] HTML日付形式閏秒に対応していません。の部分に 60 や 61 を使うことは認められていません。

照合順序

[142] sortabletable で用いられる照合順序について、 次のように定められています。

[143] 日付は、その最初の瞬間を表す地方日時と等価とします >>141

[144] 型の違う値同士は、次の順序とします >>141

  1. 時刻
  2. 月日
  3. 地方日時
  4. 大域日時
  5. 時差
  6. 時間
  7. 文字列

[145] 同じ型同士の順序は、その大小によって決めます。

関連

[60] 時刻でなく時間を表すものとしては、 http-equiv 属性Refresh の場合の content 属性値の書式 (数を指定) があります。

以前の HTML5 案には audio 要素video 要素媒体中の時間的位置を表す内容属性がありましたが、 既に削除されています。 数を返す DOM属性は削除されずに残っています。

歴史

[46] HTML日付形式は、 HTML 4.0datetime 属性が導入されたことではじめて規定され、後に Web Forms 2.0HTML5 により拡張され現在に至っています。

%Datetime; 型 (HTML4/XHTML1)

[1] HTML 4%Datetime; 型は、 W3C-DTF の2番目に長い (秒未満までは表現できない) 形式です。

[6] 仕様書:

[5]

引数実体名
%Datetime (HTML 4, XHTML 1.0)
抽象属性型名
Datetime (XHTML m12n)
属性型名
datetime (HTML 4)
SGML 属性型
CDATA
XML 属性型
CDATA
大文字・小文字
区別あり

[2] 大文字・小文字は区別されます。 TZ が使われ得ますが、 いずれも大文字でなければなりません。

[3] 時・分・秒が得られない時は、 00 としてもよいことになっています。 閏秒の 60秒は W3C‐DTF では表現できません。

[4] ins 要素や del 要素の datetime 属性が %Datetime 型です。

HTML5

[40] 現在 HTML で定義されている日付形式のほとんどは、 Web Forms 2.0日時関係のフォーム制御子を実現するために導入されました。

[41] HTML5 では HTML4 から引き継いだ ins 要素del 要素datetime 属性のための日付形式 (現在の大域日時) に加え、 time 要素のための日付や時刻の書式が導入されました。

[42] その後 Web Forms 2.0HTML5 に統合された際に、これらの定義は整理され、 本稿で紹介したような形になりました。この時、1万年問題への対応など細かい点が改められています。


[29] フォーム制御子用の日時の値は、 WF2 で当初から規定されていました。 <input type> ごとに (現在とほぼ同じ) 多数の形式が用意されていました。 最初は、完全に ISO 8601 を参照していました >>30。 後の版では、 ISO 8601 を参照しつつ、構文が明示的に定義されていた一方で、 構文解析の方法はまだ明確にされていませんでした >>28

[13] ins 要素del 要素は、 版 (現存せず) WA1 で追加されました。 datetime 属性もこのときに追加されました。

[15] この当時は、属性値適合性は、 妥当な大域日時文字列に相当するものが直接規定されていました。 一方で構文解析ISO 8601 を参照する形になっており、 ISO 8601 に従い解釈できない場合は無視することとされていました。 >>14

[82] Issues relating to the syntax of dates and times (Ian Hickson <ian@...> 著, 版) http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/16763

[83] (X)HTML5 Tracking ( 版) http://html5.org/tools/web-apps-tracker?from=2380&to=2381

[84] (X)HTML5 Tracking ( 版) http://html5.org/tools/web-apps-tracker?from=2381&to=2382

[85] (X)HTML5 Tracking ( 版) http://html5.org/tools/web-apps-tracker?from=3717&to=3718

[86] >>85 の変更分を反映する

[87] (X)HTML5 Tracking ( 版) http://html5.org/tools/web-apps-tracker?from=4317&to=4318

[88] Web Applications 1.0 r6235 Define the serialisation requirments for type=datetime. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=6234&to=6235

[89] Basic Data Types and Interfaces – SVG 1.1 (Second Edition) ( ( 版)) http://www.w3.org/TR/2011/REC-SVG11-20110816/types.html#DataTypeTime

[90] Web Applications 1.0 r6892 Limit the number of digits in the fraction part of a seconds time component to 3, since more than that and you lose precision when converting to milliseconds, e.g. for use with Date objects in the API. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=6891&to=6892

[91] [whatwg] Time Parsing ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-January/034344.html

[92] Web Applications 1.0 r6893 Define how to convert a time to a Date object if it's not a round number of milliseconds. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=6892&to=6893

[9] Sort out the handling of seconds in "parse a time component" · whatwg/html@06059a8 ( 版) https://github.com/whatwg/html/commit/06059a864e93441cb85d10d719cf306985aa1c48

[43] RFC 3339 デマについては RFC 3339の日時形式を参照。

[47] W3CHTML 5.2 などでは値域がおかしい問題があるようですが、 誰も W3CHTML 5.x は相手にしていないので、 無視して大丈夫です。 (問題があることを知っている人すらほとんどいない。)

[48] ベイビーウルフの時間だよ!(第2回) - 2019/01/14 12:00開始 - ニコニコ生放送 () http://live.nicovideo.jp/gate/lv317852272

<meta itemprop="datePublished" content="2019-01-14T12:00+0900"/>

[49] 再生制限 | サービス・機能 | NTTドコモ () https://www.nttdocomo.co.jp/service/developer/make/content/imotion/mp4/feature/contents_protection/play_restriction/index.html

【記述例】日本時間で2002年12月25日0時0分まで再生可能とする場合

<OBJECT declare id="fomacm.declaration" data="fomacm.3gp" type="video/3gpp">

<PARAM name="period" value="2002/12/24/15/00" valuetype="data">

</OBJECT>

[50] 再生制限 | サービス・機能 | NTTドコモ () https://www.nttdocomo.co.jp/service/developer/make/content/imotion/mp4/feature/contents_protection/play_restriction/index.html

再生可能日数 再生開始日から再生を可能とする日数を整数にて指定

1日単位で宣言し、上限値は999日