1. 简介 (Introduction)
简明二进制对象表示 (Concise Binary Object Representation, CBOR) [RFC7049] 支持结构化数据交换, 且不要求预先约定模式 (schema). RFC 7049 定义了一组基本数据类型, 以及一种标签 (tagging) 机制, 可通过 IANA 注册表扩展所支持的数据类型集合.
本规范定义了一个 CBOR 标签, 用于表示不含时间的日期文本字符串. 该带标签的文本字符串按照 RFC 3339 [RFC3339] 的 "full-date" 产生式表示. 根据 RFC 3339, 它表示公历 (Gregorian calendar) 中的日期.
本规范还定义了一个 CBOR 标签, 用于表示不含时间的日期整数. 该带标签整数是无符号值或负值, 表示自公历日期 1970-01-01 以来的天数. 作为实现说明, 该值与修正儒略日 (Modified Julian Date) 值之间存在固定偏移量; 修正儒略日由 Smithsonian Astrophysical Observatory 定义为自 1858 年 11 月 17 日以来的天数. 本规范中的该值等于修正儒略日减去 40587.
注意, 由于这两个标签都用于不含时间的日期, 因此一天中的具体时间、时区和闰秒均不适用于这些值. 这两个标签都用于表示公历日期.
1.1. 日历日期 (Calendar Dates)
日历日期用于许多人类使用场景, 例如标记重要事件的日期. 例如, John Lennon 生于 1940 年 10 月 9 日, 卒于 1980 年 12 月 8 日. 驾驶执照就是此类用例之一, 其中通常包含出生日期. 本规范中使用的日期采用公历, 与 RFC 3339 [RFC3339] 中的日期相同. 这些事件的时区和实际时间有意不在日历日期中表示.
第二个标签所选择的纪元用于表示自公历日期 1970-01-01 以来的天数. 它与 IEEE Std 1003.1, 2013 Edition [POSIX.1] 的时间纪元 1970-01-01T00:00:00Z UTC 的关系仅在于二者都包含日期 1970-01-01. 不应将其理解为使用该标签的日期表示某个具体的一天中时间和/或时区.
星期几 (Sunday、Monday、Tuesday 等) 不会在这两种日期格式中显式表示. 但是, 可以使用确定性算法从这两种格式表示的日期推导出公历中的星期几; 这些算法超出本规范范围.
1.1.1. 日期表示示例 (Example Date Representations)
下表包含使用两个标签表示日期的示例.
| 日期 (Date) | Tag 1004 | Tag 100 |
|---|---|---|
| 1940 年 10 月 9 日 | "1940-10-09" | -10676 |
| 1980 年 12 月 8 日 | "1980-12-08" | 3994 |
Table 1
1.2. 比较日期 (Comparing Dates)
"full-date" 格式的日期可以通过普通字符串比较完成, 因为按设计, 表示日期的数字采用固定格式, 并从最高有效部分到最低有效部分排序. 表示自 1970-01-01 以来天数的数值日期可以通过普通整数比较完成. 其他格式或使用其他历法的日期比较需要转换, 这些转换超出本规范范围.
注意, 不同日期可能对应同一时间点, 这取决于确定该日期的时区. 例如, 在一天中的许多时刻, 日本某个特定日期发生的电话会议会同时发生在夏威夷的前一日期; 在一天中的许多时刻, 日本的星期五对应夏威夷的星期四.
1.3. 比较日期和日期/时间值 (Comparing Dates and Date/Time Values)
将日期与表示特定时间点的日期/时间值进行比较超出本规范范围. 尽管如此, 如果为某个日期补充时区和一天中的时间, 就可以确定一个具体的日期/时间值, 并能够将该日期/时间值与其他日期/时间值比较. 例如, 如果为 John Lennon 的出生日期 1940 年 10 月 9 日补充其出生时的一天中时间和时区, 就可以推导出他出生时的日期/时间, 并将其与其他日期/时间值比较.