[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]] * メモ