/
206.txt
399 lines (289 loc) · 18.4 KB
/
206.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
[14] [[RFC 3339]] は [[IETF]] の新しい仕様で使われることが多い[[日時]]の表記方法を規定しています。
* 代替
[31] [[RFC 3339の日時形式]]は近年の [[IETF]] の仕様ではよく使われていますが、
それ以外ではあまり使われていません。 [[IETF]]
内でも細かなバリエーションがあって統一しきれていません。
[[IETF]] が規定する仕様を利用する場合を除き、本[[日時形式]]は使うべきではなさそうです。
類似した[[日時形式]]の中では [[HTMLの日時形式]]がより厳密に規定されており、
利用しやすくなっています。
* 仕様書
[REFS[
- [24] [CITE@en[RFC 3339 - Date and Time on the Internet: Timestamps]] ([TIME[2014-09-29 15:50:28 +09:00]] 版) <https://tools.ietf.org/html/rfc3339>
-- [79] [CITE@en[RFC 3339 - Date and Time on the Internet: Timestamps]] ([TIME[2017-05-07 16:17:18 +09:00]]) <https://tools.ietf.org/html/rfc3339#section-4>
- [25] [CITE[RFC Errata Report]] ([TIME[2014-11-13 04:10:16 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=3339>
]REFS]
* BNF
[PRE[
date-time = full-date "T" full-time
]PRE]
[PRE[
full-date = date-fullyear "-" date-month "-" date-mday
full-time = partial-time time-offset
]PRE]
[PRE[
date-fullyear = 4DIGIT
date-month = 2DIGIT ; 01-12
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
month/year
time-hour = 2DIGIT ; 00-23
time-minute = 2DIGIT ; 00-59
time-second = 2DIGIT ; 00-59, 00-60 based on leap second rules
time-secfrac = "." 1*DIGIT
time-numoffset = ("+" / "-") time-hour ":" time-minute
time-offset = "Z" / time-numoffset
]PRE]
[PRE[
partial-time = time-hour ":" time-minute ":" time-second
[time-secfrac]
]PRE]
* 年
[19] [[ISO 8601]] (の当時の版) に従い、年号は4桁でなければなりません。1万年以降や0年よりも前は記述できません。
[1] この日付形式は[[2000年問題]]には対応していますが,[[10000年問題]]には対応出来ません。実装は [CODE(ABNF)[full-year = 4*DIGIT]] と読み替えるのが良いでしょう。但しこの場合固定長であるという特徴が失われるので注意する必要があります。
[2] なお、西暦1年〜999年を表す時には0を補わなければならないことに注意が必要です。 (但しそれ以前に[[暦]]が違うことにもっと注意が必要です。)
* 指示子
[17] [[指示子]]として [CODE[[[T]]]] と [CODE[[[Z]]]] があります。どちらも[[大文字]]と[[小文字]]のいずれでも良いことになっています。
ただし、[[大文字]]で生成する[['''べき''']]とされています [SRC[[[RFC 3339]]]]。
[26] 日時の区切りは [CODE[[[T]]]] と ([[ABNF]] 構文上は) されていますが、
[[NOTE]] において可読性のために[[空白]]など他の文字に置き換えても良い
[SRC[>>24]] となっています。単に「[[RFC 3339]] に従う」
というとき、何を区切りとして使う (認識する) べきなのかは明らかではありません。
* 閏秒
[18] [[RFC 3339]] は[[閏秒]]に対応しています。[[正閏秒]]として60秒を使うことができ、
[[負閏秒]]では59秒を使いません [SRC[[[RFC 3339]]]]。
;; [32] 実装がこれを正しく扱えるのかどうかは定かではありません。
* 時間帯
[4] [[UTC]] との[[時差]]を記述することができます。
;; [80] これは [[fingerprinting vector]] です。
[78] [[時差]]は[[分]]単位です。[[秒]]単位の[[時差]]は記述できず、
適当な[[分]]単位の[[時差]]になおして記述するしかありません [SRC[>>79]]。
[81] [[UTC]] での[[時刻]]はわかるものの[[地方時]]が不明なことを示す特別な[[時差]]表記
[CODE[-00:00]] があります。
;; [39] これは [[RFC 822の日時形式]]由来の慣習で、
[[ISO 8601の日時形式]]にはない独自の解釈です。
[CODE[-00:00]] 参照。
* 文脈
[28] [CODE[[[report-uri]]]] で指定された [[URL]] に送信される [[JSON]]
では、本形式が採用されています。
[8] [[RFC 2518]] <urn:ietf:rfc:2518> 23.2 附属書2 にも簡単な説明があります。
これは Chris Newman の Internet Draft から採ったものとされていますが、
この draft の最終的に RFC になったものが RFC 3339 です。
[3] [[RFC2518]] (WebDAV) 規定時には RFC 3339 がまだ [[I-D]] だったので、 2518 23.2 (附属書2) で 3339 と同じものを規定しています。
[27] [[RFC 2518]] の改訂版である [[RFC 4918]] では [[RFC 3339]]
が参照されています。
[FIG(short list)[
- [CODE(URI)@en[[[DAV:creationdate]]]]
]FIG]
[6]
この形式を採用した規格には、
[[IETF]] [[CPIM]] などがあります。
[5]
[[RFC 4646]] は、 [[IANA]] 登録簿の[[日付形式]]として [[RFC 3339]]
の [CODE(ABNF)@en[[[full-date]]]] を採用しています。
* IETF の XML 系仕様の日付形式
[15] [[IETF]] の [[XML]] 系仕様では [[XML Schema]] や [[RELAX NG]] のデータ型としては [CODE(XML)@en[[[xs:dateTime]]]]
([[XML Schemaの日付形式]]) を採用しつつ、本文で「[[RFC 3339]] の [CODE[[[date-time]]]] かつ [CODE[[[T]]]]
と [CODE[[[Z]]]] は[[大文字]]」とされていることが多いです。[[スキーマ]]が[[規定]]か[[参考]]かは仕様によりますが、
[[RFC 3339]] と [[XML Schema]] の両方の規定の[[積集合]]に従わなければならないということになります。
;; [44] [[ISO 8601の日付形式]>>25]に、両者の比較があります。
[6] [CODE[xs:dateTime]] は[[10000年問題]]に対応していますが、
[[RFC 3339の日時形式]]は対応していません。
両方の規定に従うためには、9999年までの[[年]]しか扱えません。
** Date construct (Atom 1.0)
[48] [[Atom]] [SRC[>>46]] および [[Metalink]] [SRC[>>47]]
では、[[日時]]の指定は [DFN[[[Date construct]]]] と呼ばれています。
[49] [[Date construct]] 中には[[空白]]を含めては[['''なりません''']]
[SRC@en[[[Atom 1.0]] 3.]]。
[50] [[RFC 3339]] の [CODE[[[date-time]]]] ([[RFC 3339の日付形式]]) でなければなりません。
記号 [CODE[[[T]]]] と [CODE[[[Z]]]] は[[大文字]]でなければ[['''なりません''']]。 [SRC[>>46, >>47]]
[51] [[RELAX NG]] [[スキーマ]] ([[参考]]) では [CODE[[[xsd:dateTime]]]] となっています [SRC[>>46, >>47]]。
[REFS[
- [46] [CITE@en[RFC 4287 - The Atom Syndication Format]] ([TIME[2008-08-30 23:12:03 +09:00]] 版) <https://tools.ietf.org/html/rfc4287#section-3>
-- [CSECTION@en[3.3. Date Constructs]]
- [47] [CITE@en[RFC 5854 - The Metalink Download Description Format]] ([TIME[2014-09-14 16:54:14 +09:00]] 版) <https://tools.ietf.org/html/rfc5854#section-3.2>
]REFS]
;; [53] [[Atom 0.3]] では [[W3C-DTF]] が用いられていました。 [[Atom 1.0]]
の定義とほとんど変わりませんが、厳密には多少の違いがあります。
[FIG(quote)[
[FIGCAPTION[
[41] [CITE@en[Commit e188b782a1dc1bd8e9e0006fea476b6c92fd04a7 to hakobe's pig - GitHub]] ([TIME[2009-05-24 10:33:12 +09:00]] 版) <http://github.com/hakobe/pig/commit/e188b782a1dc1bd8e9e0006fea476b6c92fd04a7>
]FIGCAPTION]
>Gmailのフィードがhoursが24以上の日付を返してくる
]FIG]
[42] [[W3C]] の[[メーリングリスト]]の[[アーカイブ]]の [[Atomフィード]]は、
[PRE(XML code)[
<updated>2014-03-01T11:01:35+0000(UT:C)</updated>
]PRE]
... のようなおかしな日付を出力します。
([[RFC 822の日付形式]]から変換するときに、[[注釈]]を考慮せずに[[時間帯]]の「:」を補っているようですね・・・。)
** EPP
[54] [[EPP]] では、 [[RFC 3339]] と
[[XML Schema]] [CODE(XML)[[VAR[xsd:]][[dataTime]]]]
の両方の部分集合である日付形式を規定しています。
[REFS[
- [55] [[RFC 3730]] [CITE[Extensible Provisioning Protocol (EPP)]]
<urn:ietf:rfc:3730>
-- [CSECTION[5. Internationalization Considerations]]
- [56] [[RFC 3731]] [CITE[Extensible Provisioning Protocol (EPP) Domain Name Mapping]]
<urn:ietf:rfc:3731>
-- [CSECTION[2.4. Dates and Times]]
-- [CSECTION[5. Internationalization Considerations]]
- [57] [[RFC 3732]] [CITE[Extensible Provisioning Protocol (EPP) Host Mapping]]
<urn:ietf:rfc:3732>
-- [CSECTION[2.4. Dates and Times]]
-- [CSECTION[5. Internationalization Considerations]]
- [58] [[RFC 3733]] [CITE[Extensible Provisioning Protocol (EPP) Contact Mapping]]
<urn:ietf:rfc:3733>
-- [CSECTION[2.7. Dates and Times]]
-- [CSECTION[5. Internationalization Considerations]]
- [59] [[RFC 3915]] [CITE[Domain Registry Grace Period Mapping for the Extensible Provisioning Protocol (EPP)]]
<urn:ietf:rfc:3915>
-- [CSECTION[3.3. Dates and Times]]
]REFS]
[60] RFC 3730〜3733 によれば:
- [61] 基本的には [[RFC 3339の日付形式]] ([CODE(ABNF)[[[date-time]]]]) です。
- [62] [[時間帯]]は [CODE[Z]] でなければ'''なりません'''。
- [63] [CODE[T]] と [CODE[Z]] は大文字でなければ'''なりません'''。
[64] 例:
- [65] [SAMP[2000-06-06T22:00:00.0Z]]
- [66] [SAMP[2005-11-26T22:00:00.0Z]]
** UTC 固定の変種
[67] [[RFC 3982]] は[[時間帯]]を [[UTC]] ([CODE[Z]])
に固定しています。 ([[XML Schema]] 定義では
[CODE(XML)[[VAR[xs:]]dateTime]] を使用。)
[REFS[
- [68] [[RFC 3982]] [CITE[IRIS: A Domain Registry (dreg) Type for the Internet Registry Information Service (IRIS)]]
<urn:ietf:rfc:3982>
-- [CSECTION[3.2.1. Privacy Labels]]
]REFS]
[69] [[EPPの日付形式]]は [CODE(XML)[[VAR[xs:]]dataTime]]
と [[RFC 3339の日付形式]]の両方の部分集合で、
時間帯を [CODE[Z]] に固定した上で [CODE[T]] と [CODE[Z]]
を[[大文字]]で記述すると規定しています。
([[XML Schema]] 定義では [CODE(XML)[[VAR[xs:]]dateTime]] を使用。)
[70] [[WS-BaseFaults]] 1.2 は、[[時間帯]]が省略された場合には [[UTC]]
と解釈[['''しなければなりません''']]と規定しています。
** RFC 5070
[38] [[RFC 5070]] は、 [[RFC 3339]] と [CODE[xs:dateTime]] に加えて
[[ISO 8601:2000]] にも言及しています。これが[[適合性]]と処理にどう影響するのか評価するのは難しいです。
([[RFC 3339]] も [CODE[xs:dateTime]] も [[ISO 8601]] をベースにはしていますが、
細部は違っています。)
[FIG(quote)[
[FIGCAPTION[
[29] [CITE@en[RFC 5070 - The Incident Object Description Exchange Format]]
([TIME[2015-07-11 22:59:28 +09:00]] 版)
<https://tools.ietf.org/html/rfc5070#section-2.8>
]FIGCAPTION]
> Date-time strings are formatted according to a subset of ISO 8601:
2000 '''['''13''']''' documented in RFC 3339 '''['''12''']'''.
The DATETIME data type is implemented as an "xs:dateTime" '''['''3''']''' in the
schema.
]FIG]
* Syslog の日時
[20] [[Syslog]] の [CODE[[[TIMESTAMP]]]] は [[RFC 3339の日時形式]]を採用していますが、
次の制約を加えています [SRC[>>13]]。
[FIG(list)[
- [21] [[大文字]]を使わなければ[['''なりません''']]。
- [22] [CODE[[[T]]]] を使わなければ[['''なりません''']]。
- [23] [[閏秒]]を使っては[['''なりません''']]。
]FIG]
;; [[閏秒のない時刻系]]参照。
[REFS[
- [13] [CITE@en[RFC 5424 - The Syslog Protocol]] ([TIME[2014-09-14 04:23:15 +09:00]] 版) <https://tools.ietf.org/html/rfc5424#section-6.2.3>
]REFS]
* 関連
[7] RFC 3339 の日付・時刻形式は、 [[ISO 8601の日付形式]]の[[部分集合]]です。
[16] [[ISO 8601の日付形式]>>25]に、類似形式との比較があります。
** HTML との関係
[9] [[HTMLの日付形式]] ([[大域日時]]) と似ていますが、 [[HTML]]
では [[T]] や [[Z]] に[[大文字]]を使わなければなりませんし、
[[HTML]] は[[閏秒]]にも対応していません。
[45] [[HTML]] が [[RFC 3339の日時形式]]を採用したことは一度もありません。
[52] [[RFC 3339]] が特別な解釈を与えた値 ([CODE[-00:00]]) を禁止している
[SRC[>>71 ソースコードのコメント参照]] ように、関係性を意識はしていますが、
それは互換性を求める存在というよりは区別されるべき存在としてでしょう。
[72] ところが、一部で [[HTML]] の[[日時]]が [[RFC 3339]] 形式であるとの[[デマ]]が流布されたことがあるようです。
しかもその元をたどると、 (当時まだ [[WHATWG]] と協力関係にあった) [[W3C]]
の [[HTML WG]] の [CITE[HTML: The Markup Language]] という文書でした。
[CODE[/TR/]] で出版された最初の版に既に [[RFC 3339]] 形式を制限したものだとの記載
[SRC[>>73]] があり、 [CODE[/TR/]] で出版された最後の版ではそれが“拡充”されていました
[SRC[>>74, >>75]]。
[76] この文書は、[[著者]]向けを謳って [CITE[HTML 5]] 本体仕様の内容を説明しなおしたものでしたが、
当時から技術的内容が異なる可能性が指摘され、存在意義に疑問を持たれていました。
実際、本来の規定と異なる内容を「[[著者]]向けにわかりやすく」公式に説明することで、
[[デマ]]を拡散してしまったわけです。 (危惧が現実化したことまで当時把握していたかどうかは不明ですが、
この文書は結局未完成のまま破棄されました。落ち着くべきところに落ち着いたのは良かったですが...)
[77] そもそもなぜこの文書が [[RFC 3339]] を参照していたのかは、謎です。
[CITE[HTML 5]] を読まずに書いたわけではないでしょうし。。。
[REFS[
- [71] [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>
- [73] [CITE[HTML5: Datatypes]] ([TIME[2010-03-05 02:35:56 +09:00]]) <https://www.w3.org/TR/2010/WD-html-markup-20100304/datatypes.html#common.data.datetime>
- [74] [CITE[Data types (common microsyntaxes) - HTML5]] ([TIME[2012-10-25 01:11:22 +09:00]]) <https://www.w3.org/TR/2012/WD-html-markup-20121025/datatypes.html#common.data.datetime>
- [75] [CITE[del – deleted text - HTML5]] ([TIME[2012-10-25 01:11:22 +09:00]]) <https://www.w3.org/TR/2012/WD-html-markup-20121025/del.html#del>
]REFS]
* 歴史
[10] [CITE@en[Web Applications 1.0 r5474 disallow -00:00 in a global date and time stringFixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10370]]
( ([TIME[2010-09-24 09:55:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5473&to=5474>
[11] [CITE[Common Alerting Protocol]]
( ([TIME[2010-07-02 01:02:47 +09:00]] 版))
<http://docs.oasis-open.org/emergency/cap/v1.2/CAP-v1.2-os.html>
[12] [CITE@en[RFC 6021 - Common YANG Data Types]]
([TIME[2010-10-07 04:53:03 +09:00]] 版)
<http://tools.ietf.org/html/rfc6021>
[FIG(quote)[
[FIGCAPTION[
[30] [CITE@en[RFC 7493 - The I-JSON Message Format]]
([TIME[2015-11-29 21:37:53 +09:00]] 版)
<https://tools.ietf.org/html/rfc7493#section-4.3>
]FIGCAPTION]
> It is RECOMMENDED that all such data
> items be expressed as string values in ISO 8601 format, as specified
> in '''['''RFC3339''']''', with the additional restrictions that uppercase rather
> than lowercase letters be used, that the timezone be included not
> defaulted, and that optional trailing seconds be included even when
> their value is "00". It is also RECOMMENDED that all data items
> containing time durations conform to the "duration" production in
> Appendix A of RFC 3339, with the same additional restrictions.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[33] ([TIME[2015-10-04 21:50:44 +09:00]] 版)
<http://www.houjin-bangou.nta.go.jp/documents/k-resource-dl.pdf>
]FIGCAPTION]
>
,*凡例,*凡例の説明
,YYYY-MM-DD,インターネットの技術標準を議論するIETFによる、RFC3339に則った形式。平成27年10月5日(2015年10月5日)の場合は、「2015-10-05」と設定する。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[34] [CITE@ja[ScalaでRSSフィードの処理を書いてみたら思ったより大変でした - argius note]]
([TIME[2016-01-07 17:36:27 +09:00]] 版)
<http://argius.hatenablog.jp/entry/20130830/1377867921>
]FIGCAPTION]
> RSS2.0の日付もRFC 3339になっているケースが割とありました。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[35] [CITE[JSON Mail Access Protocol Specification (JMAP)]]
([TIME[2016-03-11 14:55:42 +09:00]] 版)
<http://jmap.io/spec.html>
]FIGCAPTION]
> Where the API specifies Date as a type, it means a string in RFC3339 date-time format, with the time-offset component always Z (i.e. the date-time MUST be in UTC time) and time-secfrac always omitted. The “T” and “Z” MUST always be upper-case. For example, "2014-10-30T14:12:00Z".
> Where the API specifies LocalDate as a type, it means a string in the same format as Date, but with the Z omitted from the end. This only occurs in relation to calendar events. The interpretation in absolute time depends upon the time zone for the event, which MAY not be a fixed offset (for example when daylight saving time occurs).
]FIG]
[FIG(quote)[
[FIGCAPTION[
[36] ([TIME[2016-06-27 15:00:30 +09:00]])
<http://www.houjin-bangou.nta.go.jp/documents/k-resource-dl.pdf>
]FIGCAPTION]
> YYYY-MM-DD インターネットの技術標準を議論するIETFによる、RFC3339に則った形式。
> 平成27年10月5日(2015年10月5日)の場合は、「2015-10-05」と設定する。
]FIG]
[37] 確かに[[日時形式]]の構文定義の一部として[[日付形式]]も [[RFC 3339]]
で定義されていると言えなくはないですが... [[RFC 3339]] を読んでも[[日時]]単体の構文を規定することを目的とした[[仕様書]]には見えないんですよねぇ...
[40] [CITE@en[draft-ietf-impp-datetime-00 - Date and Time on the Internet: Timestamps]]
([TIME[2017-05-02 18:01:36 +09:00]])
<https://tools.ietf.org/html/draft-ietf-impp-datetime-00>
[43] [CITE@en[draft-newman-datetime-01 - Date and Time on the Internet]]
([TIME[2017-05-08 04:26:18 +09:00]])
<https://tools.ietf.org/html/draft-newman-datetime-01>