Jos*_*ver 2 language-agnostic datetime date iso8601 timezone-offset
具有时区的ISO 8601日期时间的格式如下:
2018-09-07T05:28:42Z
Run Code Online (Sandbox Code Playgroud)
但是,我需要在系统中表示一些日期,其精度是天,而不是秒,这意味着它将是ISO 8601日历日期。日历日期的格式如下:
2018-09-07
Run Code Online (Sandbox Code Playgroud)
在有关该标准的Wikipedia文章中(我无权访问该标准本身,因为您必须为此特权付费),在讨论日期时没有提及时区。它确实谈到了省略部分时间:
为了简洁起见,基本或扩展时间格式中都可以省略秒或分钟和秒,但会降低精度:[hh]:[mm],[hh] [mm]和[hh]是降低的精度时间格式。
由此看来,您似乎不能省略小时,因此我无法这样写一个日历日期:
2018-09-07TZ
Run Code Online (Sandbox Code Playgroud)
看来,我能做的最好的事情就是缩短时间:
2018-09-07T00Z
Run Code Online (Sandbox Code Playgroud)
但是,如果我可以避免的话,我就不想这样做,因为我为日期添加的精度比实际的精度更高。该日期表示“在UTC时区的2018年9月7日的某个时间”,而不是“在UTC时区的2018年9月7日的午夜的某个时间”。
有什么建议么?
正式地,除非提供时间,否则ISO 8601规范不允许带时区的日期。因此,如果您希望保持符合ISO 8601的要求,则不能提供除年,月和日之外的仅日期值的其他信息(不求助于时间间隔-下文将进一步介绍)。
允许这样做的一种格式是XML Schema(也称为“ XSD”)xs:date。在那里,它是可选的,并且会紧随其后,例如2018-09-07Z。XSD规范在第D.3节:与ISO 8601格式的偏差中列出:
D.3.4允许
的时区数据类型date,gYearMonth,gMonthDay,gDay,gMonth和gYear的词汇表述允许可选的尾随时区规范。
我知道您并不是在问XSD,但这是我所知的唯一可免费在线获得的,涉及日期时区的规范性参考,它偏离了ISO 8601。
正如其他人指出的那样-考虑带时区的日期是一件棘手的事情。在许多方面,仅日期值是不明确的。考虑一下我是否给您提供了这样的日历:
指向该日历上的任何给定日期都不会告诉我有关时区的任何信息。我可以将日历提供给其他时区的人,他们仍然可以谈论日期。简而言之,如果我们两个人都同时指向“今天”,那么我们可能不会指向同一日期。因此,时区仅在我们应用时间上下文时适用,无论是“现在”还是特定的时间上下文。
但是,我们确实倾向于根据时区合理化给定日期的所有时间点。在您的示例中,为“ UTC日”。我们的意思是,它的运行时间T00:00Z是一天,直到第二天之前T00:00Z。这通常是诸如xs:date允许时区偏移之类的原因背后的原因。
如果我们要严格遵守ISO 8601并表示相同的含义,则必须提供日期+时间值的范围,在ISO 8601规范的第4.4节中将其称为“时间间隔”,并以正斜杠(/)字符。这样的值的一个示例是2018-09-07T00:00Z/2018-09-08T00:00Z。但是,请小心,因为ISO 8601并没有说明结束日期是包含性解释还是排他性解释。 在这里更多。
间隔的另一个ISO 8601表示形式允许一个开始时间和一个持续时间分量,例如2018-09-07T00:00Z/P1D。在我看来,这就像最接近ISO 8601的完全代表UTC解释的完整日期的方式。
不过,就我个人而言,如果我需要传达带有日期的时区,2018-09-07Z即使不严格遵守日期,我也会使用。只要确保您所有数据的使用者都同意这种格式即可。如果您无法做到这一点,只需传递2018-09-07并命名您的字段,例如utcDate。
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |