[7] [[HTML]] ではいくつかの[[属性]]などで[[日時]]を表す文字列が用いられています。
そのほとんどは [[ISO 8601の日付形式]]に近いものですが、歴史的な理由により異なる書式を採用している文脈もあります。
[[HTML]] で定義されている[[日付形式]]には、次のものがあります。
- [[時刻]]
- [[月]]
- [[日付]]
- [[週]]
- [[地方日時]]
- [[大域日時]]
- [[日付か時刻]]
[8] 仕様書:
- [[HTML5]]
* 定義
[10] [DFN[[RUBYB[数字]@en[digit]]]]とは、
[CODE(char)[[[U+0030]]]]〜[CODE(char)[[[U+0039]]]] の[[文字]]であって、
[[十進数]]を表すために使われます [SRC@en[[[HTML5]]]]。
[9] ある[[年]]のある[[月]]の[[日]]の数は、[[グレゴリオ暦]]に基づき、次のように定義されています
[SRC@en[[[HTML5]]]]。
- [[1月]]、[[3月]]、[[5月]]、[[7月]]、[[8月]]、[[10月]]、[[12月]]は、 '''31'''
- [[4月]]、[[6月]]、[[9月]]、[[11月]]は、 '''30'''
- [[2月]]は、
-- [[年]]が400で割り切れるか、または4で割り切れて100で割り切れないなら
([[閏年]]なら)、 '''29'''
-- それ以外なら、 '''28'''
* 時刻
[20] [DFN[[RUBYB[時刻]@en[time]]]]は、特定の[[時刻]]を表し、
[[時]]、[[分]]、[[秒]]、[[秒の小数部]]から成ります。[[時間帯]]の情報は持ちません。
[SRC@en[[[HTML5]]]]
-[21] [CODE(ABNF)[[DFN[[RUBYB[妥当な時刻文字列]@en[valid time string]]]] := 2[[数字]] ":" 2[[数字]] [":" 2[[数字]] ["." 1*[[数字]] ] ] ]]
[SRC@en[[[HTML5]]]]
-- 1つ目の[[数字]]列は、[[時]]を表す 0〜23 の[[数]]
-- 2つ目の[[数字]]列は、[[分]]を表す 0〜59 の[[数]]
-- 3つ目の[[数字]]列は、[[秒]]の[[整数部]]を表す 0〜59 の[[数]] ([[秒]]が 0 の時だけ省略可能)
-- 4つ目の[[数字]]列は、[[秒]]の[[小数部]]を表す値 ([[秒]]が[[整数]]の時だけ省略可能)
[23] [DFN[[RUBYB[時刻文字列の構文解析]@en[parse a time string]]]]
[SRC@en[[[HTML5]]]]:
= [[時刻部品の構文解析]]を行い、それが何も返さなかったら、何も返さないで終える
= [[文字列]]がそれで終わっていなければ、何も返さないで終える
= (1) で得られた[[時]]と[[分]]と[[秒]]を返す
[24] [DFN[[RUBYB[時刻部品の構文解析][parse a time component]]]]
[SRC@en[[[HTML5]]]]:
= [[文字列]]が[[正規表現]] [CODE(regexp)[([[数字]]{2}):([[数字]]{2})(?::([[数字]]{2}(?:\.[[数字]]+)?))?]]
に[[一致]]しない場合、何も返さず終わる
= $1 を[[十進数]]として解釈したものを[[時]]とする
= $2 を[[十進数]]として解釈したものを[[分]]とする
= $3 を[[十進数]]として解釈したものを[[秒]]とする ($3 がない場合、 0 とする)
= [[時]]が 0〜23 でない場合、何も返さない
= [[分]]が 0〜59 でない場合、何も返さない
= [[秒]]が 60 [[未満]]の[[正数]]でない場合、何も返さない
= [[時]]と[[分]]と[[秒]]を返す
* 月
[11] [DFN[[RUBYB[月]@en[month]]]]は、[[グレゴリオ暦]]上の[[日付]]を表します。ただし、
[[月]]は[[時間帯]]の情報を持ちませんし、[[日付]]の精度は[[年]]と[[月]]だけで、[[日]]は特定しません。
[SRC@en[[[HTML5]]]]
- [13] [CODE(ABNF)[[DFN[[RUBYB[妥当な月]@en[valid month]]]] := 4*[[数字]] "-" 2[[数字]]]]
[SRC@en[[[HTML5]]]]
-- 1つ目の[[数字]]列は、[[年]]を表す[[正数]]
-- 2つ目の[[数字]]列は、[[月]]を表す 1〜12 の[[数]]
[14] [DFN[[RUBYB[月文字列の構文解析]@en[parse a month string]]]]
[SRC@en[[[HTML5]]]]:
= [[月部品の構文解析]]を行い、それが何も返さなかったら、何も返さないで終える
= [[文字列]]がそれで終わっていなければ、何も返さないで終える
= (1) で得られた[[年]]と[[月]]を返す
[15] [DFN[[RUBYB[月部品の構文解析][parse a month component]]]]
[SRC@en[[[HTML5]]]]:
- 与えられた[[文字列]]が[[正規表現]] [CODE(regexp)[([[数字]]{4,})-([[数字]]{2})]]
に[[一致]]すれば、
-= $1 を[[十進数]]として解釈したものを[[年]]とする
-= $2 を[[十進数]]として解釈したものを[[月]]とする
-= [[年]]が 0 なら、何も返さない
-= [[月]]が 1〜12 でなければ、何も返さない
-= そうでない場合、[[年]]と[[月]]を返す
- そうでない場合、何も返さない
* 日付
[16] [DFN[[RUBYB[日付]@en[date]]]]は、[[グレゴリオ暦]]上の[[日付]]を表します。
[[日付]]には[[年]]、[[月]]、[[日]]が含まれますが、[[時間帯]]は含まれません。
[SRC@en[[[HTML5]]]]
-[17] [CODE(ABNF)@en[[DFN[[RUBYB[妥当な日付文字列]@en[valid date string]]]] := [[妥当な月文字列]] "-" 2[[数字]]]]
[SRC@en[[[HTML5]]]]
-- 最後の[[数字]]列は、[[年]]と[[月]]に基づく[[日]]の数 (>>9) [[以下]]の[[正数]]で、[[日]]を表す
[18] [DFN[[RUBYB[日付文字列の構文解析]@en[parse a date string]]]]
[SRC@en[[[HTML5]]]]:
= [[日付部品の構文解析]]を行い、それが何も返さなかったら、何も返さないで終える
= [[文字列]]がそれで終わっていなければ、何も返さないで終える
= (1) で得られた[[年]]と[[月]]と[[日]]を返す
[19] [DFN[[RUBYB[日付部品の構文解析][parse a date component]]]]
[SRC@en[[[HTML5]]]]:
= [[月部品の構文解析]]により、[[年]]と[[月]]を得る。何も返されなかった場合、何も返さず終わる
= [[文字列]]の続きが[[正規表現]] [CODE(regexp)[-([[数字]]{2})]] に[[一致]]しない場合、何も返さず終わる
= $1 を[[十進数]]として解釈したものを[[日]]とする
= [[日]]が[[年]]と[[月]]に基づく[[日]]の数 (>>9) [[以下]]の[[正数]]でなければ、何も返さず終わる
= [[年]]と[[月]]と[[日]]を返す
* 地方日時
[25] [DFN[[RUBYB[地方日時]@en[local date and time]]]]は、
[[グレゴリオ暦]]上の[[日時]]を表します。
[[年]]、[[月]]、[[日]]、[[時]]、[[分]]、[[秒]]、[[秒の小数部]]から成ります。
[[時間帯]]の情報は含みません。
[SRC@em[[[HTML5]]]]
-[26] [CODE(ABNF)@en[[DFN[[RUBYB[妥当な地方日時文字列]@en[valid local date and time string]]]] := [[妥当な日時文字列]] 'T' [[妥当な時刻文字列]]]]
[SRC@em[[[HTML5]]]]
-- 「T」は[[大文字]]でなければなりません。
[27] [DFN[[RUBYB[地方日時文字列の構文解析]@en[parse a local date and time string]]]] [SRC@en[[[HTML5]]]]:
= [[日付部品の構文解析]]により、[[年]]と[[月]]と[[日]]を得る。何も返されなかった場合、
何も返さず終わる
= [[文字列]]の次の[[文字]]が[[大文字]]の「[CODE(char)[[[T]]]]」でない場合、
何も返さず終わる
= [[時刻部品の構文解析]]により、[[時]]と[[分]]と[[秒]]を得る。何も返されなかった場合、
何も返さず終わる
= [[文字列]]がそれで終わっていなければ、何も返さず終わる
= [[年]]と[[月]]と[[日]]と[[時]]と[[分]]と[[秒]]を返す
* 暦との関係
[12] [[HTML]] は[[グレゴリオ暦]] (だけ) を採用しています。[[グレゴリオ暦]]が採用される以前の[[日付]]も表すことができますが、
[[グレゴリオ暦]]を過去に延長した場合に相当する[[日付]]を使って表されます
(proleptic グレゴリオ暦などと呼ばれます)。
[22] [[HTML]] の[[日付形式]]は[[閏秒]]に対応していません。[[秒]]の部分に 60 や 61
を使うことは認められていません。
* [CODE(SGML)[%Datetime;]] 型 (HTML 4, XHTML 1)
[1] [[HTML 4]] の [DFN[[CODE(SGML)[%Datetime]]]] 型は、
[[W3C-DTF]] の2番目に長い (秒未満までは表現できない)
形式です。
[6] 仕様書:
- [[HTML 4]]
--
-- [[厳密DTD]]
-- [[移行用DTD]]
-[[XHTML 1.0]]
-- [CSECTION[A.1.1. XHTML-1.0-Strict]]
-- [CSECTION[A.1.2. XHTML-1.0-Transitional]]
-- [CSECTION[A.1.3. XHTML-1.0-Frameset]]
- [[XHTML m12n]]
--[CSECTION[4.3. Attribute Types]]
[5]
:[[引数実体名]]:[CODE(SGML)[%Datetime]] ([[HTML 4]], [[XHTML 1.0]])
:抽象属性型名:[CODE[Datetime]] ([[XHTML m12n]])
:属性型名:[Q[datetime]] ([[HTML 4]])
:[[SGML]] [[属性型]]:[CODE(SGML)[[[CDATA]]]]
:[[XML]] [[属性型]]:[CODE(XML)[[[CDATA]]]]
:大文字・小文字:区別あり
[2] 大文字・小文字は区別されます。
[CODE(HTML)[T]] と [CODE(HTML)[Z]] が使われ得ますが、
いずれも大文字でなければなりません。
[3] 時・分・秒が得られない時は、 [CODE(HTML)[00]]
としてもよいことになっています。
閏秒の 60秒は W3C‐DTF では表現できません。
[4]
[CODE(HTMLe)[[[ins]]]] 要素や [CODE(HTMLe)[[[del]]]] 要素の [CODE(HTMLa)[[[datetime]]]] 属性が [CODE(SGML)[%Datetime]] 型です。
[[#comment]]
* メモ