[28] [DFN[[RUBYB[[[時差]]]@en[time-zone offset]]]]は、[[時]]と[[分]]によって構成される[[符号]]つき[[数]]です 
[SRC[>>8]]。

[108] [[大域日時]]や[[日付や時刻]]には[RUBYB[[[時間帯]]]@en[timezone]]の情報を含めることができます。

* 仕様書

[REFS[
- [137] '''[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-timezone>'''
- [138] [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-vcard-tz>
]REFS]

* 構文定義

[109] [DFN[[RUBYB[[[妥当な時差文字列]]]@en[valid time-zone offset string]]]]とは、
[FIG[
- [110] [[UTC]] を表す[[大文字]]の [DFN[[CODE[[[Z]]]]]]
]FIG]
... か、または
[FIG[
= [111] [[符号]] [CODE[[[+]]]] または [CODE[[[-]]]]
= [112] [[時]]を表す[[ASCII数字]]2桁
= [113] [CODE[[[:]]]]
= [114] [[分]]を表す[[ASCII数字]]2桁
]FIG]
... のいずれかの[[文字列]]です。ただしここで >>111、>>112、>>114 は[[時差]]の[[符号]]、
[[時]]、[[分]]をそれぞれ表しており、 >>112 は 0〜23、 >>114 は 0〜59 の範囲でなければなりません。
また、[[時差]]が0のときは、 >>111 は [CODE[[[-]]]] でなければなりません。 [SRC[>>8]]

* vCard マイクロデータにおける時間帯

[139] [[vCard]] [[マイクロデータ]]においては、次のように[[時間帯]]の値の構文が定義されています [SRC[>>138]]。
[FIG[
= [140] [CODE[[[+]]]] または [CODE[[[-]]]]
= [141] [[ASCII数字]]2桁
= [142] [CODE[[[:]]]]
= [143] [[ASCII数字]]2桁
]FIG]

[144] >>141 は00~23、 >>143 は 00~59 でなければなりません [SRC[>>138]]。

[145] [[HTML]] の[[時差]] (>>109) と比較すると、 [CODE[[[-00:00]]]]
が認められていることと、 [CODE[[[Z]]]] が認められていないことが異なっています。

[146] [[HTML]] に埋め込まれているとはいえ、 [[HTML]] の一部としてではなく、 [[vCard]]
として処理されるので、 [[vCard]] 寄りの構文になっているものと思われます。

* 構文解析

[29] [DFN[[RUBYB[時差文字列の構文解析]@en[parse a time-zone offset string]]]]や[DFN[[RUBYB[時差部品の構文解析]@en[parse a time-zone offset component]]]]
(旧・[DFN[[RUBYB[時間帯部品の構文解析]@en[parse a timezone component]]]]) 
は、次のような処理をいいます [SRC[>>8]]。

[FIG(steps)[
= 次の[[文字]]が[[大文字]]の「[CODE(char)[[[Z]]]]」 であれば、
[[時]]として 0、[[分]]として 0 を返して終わる
= [[文字列]]が[[正規表現]] [CODE(regexp)[([+-]2[[数字]]):(2[[数字]])]]
または [CODE(regexp)[([+-]2[[数字]])(2[[数字]])]] に[[一致]]しない場合、
何も返さずに終わる
= $1 を[[十進数]]として解釈したものを[[時]]とする
= $2 を[[十進数]]として解釈したものを[[分]]とする
= [[時]]が -23〜23 でない場合、何も返さない
= [[分]]が 0〜59 でない場合、何も返さない
= [[時]]と[[分]]を返す
]FIG]

[148] これは >>109 のために規定されたものですが、 >>139 にも適用できます。

[6] この解釈の方法は、構文が満たすべき条件よりも緩くなっています。
具体的には、

- [7] [CODE[-00:00]] の利用は禁止されていますが、 [CODE[+00:00]]
と同義と解釈されます。
- [8] [CODE[:]] は必須ですが、省略されていても補完して解釈されます。

[9] >>8 は [[RFC 822の日時形式]]など他の[[日時形式]]でも一般的に用いられている形式との互換性のためと思われます。

* 過去の時間帯

[136] 歴史的な[[日時]]における[[時間帯]]の意味については、[[先発グレゴリオ暦]]の項を参照。

* 文脈

[135] [[時差]] (>>109) は、 [CODE(HTMLe)@en[[[time]]]] [[要素]]で使われます。

[134] [[時差]] (>>109) は、[[妥当な大域日時文字列]]や[[妥当な日付文字列と省略可能な時刻]]で使われます。

[147] >>139 は、 [[vCard]] [[マイクロデータ]]の [CODE[[[tz]]]] の値として使われます。

* 関連

[30] [[RFC 3339の日付形式]]などでは [[-00:00]] に[[時間帯]]不明という意味が与えられていますが、
[[HTML]] の[[時差]] (>>109) では禁止されています。 >>139 では禁止されていません。

[1] [CITE@en['''['''''']''' (0) Move pubdate='' from <article> to <time>.]]
([[Hixie]]著, [TIME[2009-08-31 16:48:53 +09:00]])
<https://github.com/whatwg/html/commit/aeed8c2ba559b0bb22f894f7ab061c30959c7e9a>

[2] [CITE@en[8028 – If the first character is not Z or + or -, the subalgorithm returns undefined values. It should explicitly fail and return nothing.]]
([TIME[2018-07-03 18:08:54 +09:00]])
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=8028>

[3] [CITE@en['''['''giowt''']''' (0) Make the 'parse a time-zone offset component' rules handl…]]
([[Hixie]]著, [TIME[2009-10-25 09:55:00 +09:00]])
<https://github.com/whatwg/html/commit/9b9d174af37d384053073e41e80f443c257336a1>

[4] [CITE@en['''['''ac''']''' (1) disallow -00:00 in a global date and time string]]
([[Hixie]]著, [TIME[2010-09-24 09:55:59 +09:00]])
<https://github.com/whatwg/html/commit/0de3e20f218fb39c9ff649dfb2c33f9dc9f08ba7>

[5] [CITE@en['''['''aco''']''' (2) Define 'local date and time', 'date', 'time', and redefine …]]
([[Hixie]]著, [TIME[2008-10-30 09:58:12 +09:00]])
<https://github.com/whatwg/html/commit/e0a11970f9ae3dc66a07a3189f5902d7650f086a>