[2] [DFN[[RUBYB[時間]@en[duration]]]]は、[[秒]]の数です [SRC[>>1]]。

* 仕様書

[REFS[
- [1] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-05-05 21:57:42 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#concept-duration>'''
- [49] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-05-05 21:57:42 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#md-vevent-duration>
- [51] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-05-05 21:57:42 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#valid-vevent-duration-string>
]REFS]

* 意味

[3] [[時間]]は、[[秒]]の数を表しています [SRC[>>1]]。構文上は[[秒]]のみならず、
[[分]]、[[時]]、[[日]]、[[週]]単位でも記述できます。しかし[[月]]の長さは変化しますから、
[[月]]や[[年]]では記述できません [SRC[>>1]]。

* 妥当な時間文字列

[4] [DFN[[RUBYB[[[妥当な時間文字列]]]@en[valid duration string]]]]とは、 >>21 と >>24
のいずれかの[[文字列]]です [SRC[>>1]]。

* HTML 独自の時間形式

[24] [[HTML]] 独自の形式は、[[時間時刻部品]]を1つ以上連ねたものです。
ただし[[時間時刻部品スケール]]は異なったものでなければなりません。順序は問いません。 [SRC[>>1]]
全体としては、各部品が表す[[時間]]の[[和]]を表します。

[26] [DFN[[RUBYB[[[時間時刻部品]]]@en[duration time component]]]]とは、
次のような[[文字列]]です [SRC[>>1]]。
[FIG[
= [27] [[空白文字]]0文字以上
= [28] [[ASCII数字]]1桁以上
= [29] 省略可能: [CODE[[[.]]]] のあと[[ASCII数字]]1~3桁
= [30] [[空白文字]]0文字以上
= [31] [[時間時刻部品スケール]]
= [32] [[空白文字]]0文字以上
]FIG]

[33] ただし >>29 は >>31 が[[秒]]単位の場合だけ使えます [SRC[>1]]。

[34] [DFN[[RUBYB[[[時間時刻部品スケール]]]@en[duration time component scale]]]]は次のいずれかです [SRC[>>1]]。
,[[文字]],意味,スケール
,[CODE[[[W]]]],[[週]],604800
,[CODE[[[D]]]],[[日]],86400
,[CODE[[[H]]]],[[時]],3600
,[CODE[[[M]]]],[[分]],60
,[CODE[[[S]]]],[[秒]],1

[35] >>34 の[[文字]]は[[ASCII大文字・小文字不区別]]です [SRC[>>1]]。

* ISO 8601 ベースの時間形式

[21] [[ISO 8601]] ベースの形式は、次のようなものです [SRC[>>1]]。

[FIG[
= [5] [CODE[[[P]]]]
= [6] [[日]]の数
== [7] [[ASCII数字]]1桁以上
== [8] [CODE[[[D]]]]
= [9] [[時]]以下
== [10] [CODE[[[T]]]]
== [11] [[時]]の数
=== [12] [[ASCII数字]]1桁以上
=== [13] [CODE[[[H]]]]
== [14] [[分]]の数
=== [15] [[ASCII数字]]1桁以上
=== [16] [CODE[[[M]]]]
== [17] [[秒]]
=== [18] [[ASCII数字]]1桁以上
=== [19] 省略可能: [CODE[[[.]]]] のあと [[ASCII数字]]1桁以上
=== [20] [CODE[[[S]]]]
]FIG]

[22] >>6 と >>9 は、どちらかまたは両方が必要です [SRC[>>1]]。

[23] >>11、>>14、>>17 は、1つ以上が必要です [SRC[>>1]]。

[25] 全体としては、各部分が表す[[時間]]の[[和]]を表します。

;; [75] 大文字でなければなりません。

* vEvent 時間文字列

[52] [DFN[[RUBYB[[[妥当なvEvent時間文字列]]]@en[valid vevent duration string]]]]とは、
次のような[[文字列]]です [SRC[>>51]]。

[FIG[
= [53] [CODE[[[P]]]]
= [54] [[週]]の数
== [55] [[ASCII数字]]1桁以上
== [56] [CODE[[[W]]]]
= [57] [[日]]の数
== [58] [[ASCII数字]]1桁以上
== [59] [CODE[[[D]]]]
= [60] [[時]]以下
== [61] [CODE[[[T]]]]
== [62] [[時]]の数
=== [63] [[ASCII数字]]1桁以上
=== [64] [CODE[[[H]]]]
== [65] [[分]]の数
=== [66] [[ASCII数字]]1桁以上
=== [67] [CODE[[[M]]]]
== [68] [[秒]]の数
=== [69] [[ASCII数字]]1桁以上
=== [70] [CODE[[[S]]]]
]FIG]

[71] ただし >>54 を指定した場合は >>57、>>60 は使えません。 >>57 と >>60
は片方または両方を指定できます。 >>62、>>65、>>68 は1つ以上指定できますが、
>>62 と >>68 の2つだけの指定はできません。 [SRC[>>51]]

[72] >>21 と比較すると、
- こちらでは[[週]]を指定できます
- こちらでは[[時]]と[[秒]]だけの指定ができません
- こちらでは[[秒]]を[[小数]]にできません

;; [76] 大文字でなければなりません。

* 構文解析

[36] [DFN[[RUBYB[[[時間文字列を構文解析]]]@en[parse a duration string]]]]するには、
次のようにします [SRC[>>1]]。

[37] 与えられた[[文字列]]が次の[[正規表現]]に[[一致]]するか調べます。

[PRE(regexp code)[
\s*
P?
(?:
  T \s*
    |
  [0-9]+ \s* [YyWwDdHhMmSs] \s*
    |
  [0-9]+\.[0-9]+ \s* [Ss] \s*
    |
  \.[0-9]+ \s* [Ss] \s*
)+
]PRE]

[38] ここで [CODE(regexp)[[[\s]]]] は、 [[HTML]] における[[空白文字]]を表します。

[39] 「M」は、「P」や「Y」の後なら[[月]]と解釈し、それ以外なら[[分]]と解釈します。

[41] 「Y」は[[年]]と解釈します。

[42] 「W」、「D」、「H」、「S」は >>34 の通り解釈します。

[40] [[数字]]と[[小数点]]は[[十進数]]として解釈します。直後の[[文字]]を[[単位]]とする[[時間]]として解釈します。

[43] >>37 に[[一致]]しない場合、[[数字]]を含まない場合、[[年]]や[[月]]が含まれる場合は、
失敗を返します。それ以外の場合は、個々の部分で表される[[時間]]の[[和]]を返します。

;; [44] これにより >>21 と >>24 のどちらも解釈できます。どちらにも一致しない文字列も解釈できることがあります。
例えば「T」が不適切な場所に混在していても、無視されます。 [[ISO 8601]] ベースの形式にも[[空白文字]]を挿入できます。
「0Y」があっても失敗せずに無視されます。

[45] >>3 のような理由で[[月]]や[[年]]を単位とすることはできませんが、
この構文解析の方法は将来の拡張や ([[HTML]] 以外での) [[ISO 8601]] 形式の誤解釈を防ぐため、
[[月]]や[[年]]にも対応しています (が[[年]]や[[月]]を含んでいると、失敗します)。

;; [73] これは >>4 のための構文解析法ですが、 >>52 にも適用できます。

* 文脈

[48] [[妥当な時間文字列]] (>>4) は、 [CODE(HTMLe)@en[[[time]]]] [[要素]]で使われます。

[50] [[妥当なvEvent時間文字列]] (>>52) は、 [[vEvent]] [[マイクロデータ]]の [CODE[[[duration]]]]
の値として使われます [SRC[>>47]]。

[74] [[妥当なvEvent時間文字列]] (>>52) は、[[HTMLの時刻の範囲の形式]]にも使われます。

* 関連

[46] [[HTML]] では[[媒体要素]]のための [CODE[12:34]] のような[[時間形式]]もありましたが、
実装されずに削除されています。

[47] [CODE(HTTP)@en[[[Refresh]]]] では[[秒]]単位の[[整数]]が使われています。

[77] [CITE@en['''['''at''']''' (0) Introduce a vEvent vocabulary.]]
([[Hixie]]著, [TIME[2009-05-14 10:14:50 +09:00]])
<https://github.com/whatwg/html/commit/425754254022e0ca969a77965cd71603f6bf5255>