ISO 8601 数据元素和交换格式 - 信息交换 - 日期和时间的表示是一种涵盖日期和时间相关数据交换的国际标准。它由国际标准化组织(ISO)发布,并于1988年首次发布。该标准的目的是提供一种明确且明确定义的日期和时间表示方法,以避免误解日期的数字表示。和时间,特别是当数据在具有不同约定的国家之间传输以写入数字日期和时间时。 在交换的表示中,日期和时间被安排成使得最大的时间项(年)被放置在左侧,并且每个连续的较小的项被放置在前一项的右侧。表示必须用阿拉伯数字和某些字符(例如“ - ”,“:”,“T”,“W”和“Z”)的组合书写,这些字符在标准中具有特定含义; 这意味着在交换表示中不允许一些编写日期部分的常用方法,例如“1月”或“星期四”。
根据ISO 8601表示的日期和时间: |
日期: | 2018年7月3日 |
以UTC结合的日期和时间: | 2018-07-03T22:44:26 + 00:00
2018-07-03T22:44:26Z
20180703T224426Z |
周: | 2018-W27 |
周数日期: | 2018-W27-2 |
没有年份的日期: | --07-03(最后在ISO8601:2000中,由RFC 6350使用[2]) |
序数日期: | 2018-184 |
内容
历史
ISO 2014虽然被取代,但是最初以最低至最低有序[YYYY] - [MM] - [DD]引入全数字日期符号的标准。ISO周编号系统在ISO 2015中引入,按顺序日期识别天数最初在ISO 2711中定义。
ISO 8601目前正在更新中,并分为两部分,预计将于2018年发布.ISO / DIS 8601-1:2016草案代表了当前ISO 8601标准略有更新的内容,[6][7]而ISO / DIS 8601-2:2016草案定义了各种扩展,例如不确定性或扩展日期/时间格式(EDTF)的部分。[8][9][10][11][12]
一般原则
- 日期和时间值按从最大到最小的时间单位排序:年,月(或周),日,小时,分钟,秒和秒的分数。因此,表示的字典顺序对应于时间顺序,除了涉及负年份的日期表示。这允许日期自然地由例如文件系统排序。
- 每个日期和时间值都有一个固定的位数,必须用前导零填充。
- 表示可以采用两种格式之一完成 - 具有最少数量分隔符的基本格式或添加了分隔符的扩展格式以增强人类可读性。[13][14]该标准指出“应以纯文本形式避免使用基本格式”。[15]日期值(年,月,周和日)之间使用的分隔符是连字符,而冒号用作时间值(小时,分钟和秒)之间的分隔符。例如,2009年第1个月的第6天可以以扩展格式写为“2009-01-06”,或者以基本格式简称为“20090106”而不含糊不清。
- 为了降低准确度,[16]可以从任何日期和时间表示中删除任意数量的值,但是从最小到最重要的顺序。例如,“2004-05”是有效的ISO 8601日期,表示2004年5月(第5个月)。此格式永远不会代表2004年未指定月份的第5天,也不代表从2004年进入2005年。
- 如果特定应用需要,标准支持在表示中的最小时间值添加小数部分。
日期2018年7月
| 周一 | 星期二 | 星期三 | 星期四 | 周五 | 星期六 | 太阳 |
W26 | 25 | 26 | 27 | 28 | 29 | 三十 | 01 |
W27 | 02 | 03 | 04 | 05 | 06 | 07 | 08 |
W28 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
W29 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
W30 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
W31 | 三十 | 31 | 01 | 02 | 03 | 04 | 05 |
ISO 8601将参考日历日期定为1875年5月20日的公历,作为在巴黎签署的公约(米公约)的日期。但是,公约之前的ISO日历日期仍然与公历兼容,一直回到公元1582-10-15的公历。在公历日历中,可以通过交换信息的合作伙伴的相互协议来使用早期日期。该标准规定每个日期必须是连续的,因此使用Julian日历将违反标准(因为在转换日期,日期不会是连续的)。
年
ISO 8601至少规定了一个四位数的年份[YYYY]以避免2000年的问题。因此,它表示从0000到9999年,0000年等于1 BC,所有其他AD。但是,标准不会自动允许1583年之前的年份。相反,“[0082]到[1582]范围内的值只能由合作伙伴在信息交换中相互协商使用。” [18] 日历日期[ 编辑]YYYY-MM-DD | 要么 | YYYYMMDD |
YYYY-MM | (但不是 YYYYMM) |
--MM-DD | 要么 | --MMDD |
日历日期表示采用相邻框中显示的形式。[YYYY]表示四位数年份,0000到9999. [MM]表示一年中的两位数月份,01到12. [DD]表示该月的两位数日,即01到31。例如,“1981年4月5日”可以被表示为任一“1981年4月5日” [13]在扩展格式中或“19810405” 的基本格式。 该标准还允许以较低的准确度编写日历日期。[16]例如,人们可以将“1981-04”写为“1981年4月”。2000版本允许写“ - 04-05”表示“4月5日” [22],但2004版本不允许省略当月存在的年份。人们可以简单地用“1981”来指代那一年或“19”来指代从1900年到1999年的世纪。虽然标准允许YYYY-MM-DD和YYYYMMDD格式用于完整的日历日期表示,但如果省略[DD]日,则仅允许YYYY-MM格式。禁止YYYYMM表格的日期,截断表示 YYMMDD(仍然经常使用)。
周日期主要文章:ISO周日期
YYYY-WWW | 要么 | YYYYWww |
YYYY-WWW-d | 要么 | YYYYWwwD |
周日期表示采用相邻框中显示的格式。[YYYY]表示ISO周编号年,与传统的公历年略有不同(见下文)。[ W ]是以字母W为前缀的周数,从W01到W53。[D]是工作日编号,从1到7,从星期一开始到星期日结束。 第01周有几个相互等效和兼容的描述:
- 今年第一个星期四的一周(正式的ISO定义),
- 1月4日的一周,
- 第一周,在开始年份的大多数(四个或更多)的日子,和
- 从12月29日至1月4日的周一开始的一周。
因此,如果1月1日是星期一,星期二,星期三或星期四,则是在01周。如果1月1日是星期五,星期六或星期日,则是在上一年的第52周或第53周(有没有第00周)。12月28日总是在同一年的最后一周。
周数可以通过计算星期四来描述:第12周包含一年中的第12个星期四。
在ISO周编号年开始在01周的第一天(周一)和新的ISO一年之前,在周日结束(因此没有重叠或间隙)。它包括52或53整周。一年中的第一个ISO周可能最多有三天,实际上正在公历年结束; 如果三,他们是星期一,星期二和星期三。同样,一年中的最后一个ISO周最多可能有三天,实际上是公历年开始的; 如果三,他们是星期五,星期六和星期日。每个ISO周的星期四总是在由ISO周编号年表示的公历年。
例子:
- 2008年12月29日星期一写成“2009-W01-1”
- 2010年1月3日星期日写成“2009-W53-7”
序数日期
一个顺序日期是场合一个简单的表格时的周,月定义的任意性是一个多援助的阻碍作用,例如,比较不同的日历日期时。如上所述,[YYYY]表示一年。[DDD]是那一年的日子,从001到365(闰年 366 )。例如,“1981-04-05”也是“1981-095”。 此格式用于需要日期系统的简单硬件系统,但包括完整日历计算软件可能是一个重要的麻烦。这个系统有时被称为“朱利安日期”,但这可能会导致与天文朱利安日的混淆,这是自公元前4713年1月1日开始的第0天以来的天数的连续计数。格林威治中午,朱利安的预感日历(或ISO中午)日期-4713-11-24,其使用具有年份[0000]的格里高利时间日历。 时代[ 编辑]HH:MM:SS.SSS | 要么 | hhmmss.sss格式 |
HH:MM:SS | 要么 | HHMMSS |
HH:MM | 要么 | HHMM |
| HH |
|
ISO 8601使用24小时制。的基本格式为[HH] [毫米] [SS]和扩展格式是[HH]:[毫米]:[SS]。 - [hh]指的是00到24之间的零填充小时(其中24仅用于表示日历日结束时的午夜)。
- [mm]指的是介于00和59之间的零填充分钟。
- [ss]指的是00到60之间的零填充秒(其中60仅用于表示增加的闰秒)。
因此,时间可能在基本格式中显示为“134730”,在扩展格式中显示为“13:47:30” 。
为了更简洁,可以省略基本或扩展时间格式中的秒数或分钟数和秒数,但精度会降低:[hh]:[mm],[hh] [mm]和[hh]导致精度降低时间格式。[23] 午夜是特殊情况,可以称为“00:00”或“24:00”。符号“00:00”在日历日的开始使用,并且使用频率更高。在一天结束时使用“24:00”。“2007-04-05T24:00”与“2007-04-06T00:00”同时发生(请参阅下面的组合日期和时间表示)。 可以将十进制分数添加到三个时间元素中的任何一个。但是,分数只能添加到表示中的最低阶时间元素。一个小数标志,无论是逗号或点(不包括在2003年在第22届大会CGPM的10号决议指出任何偏好,[24]但对于偏好逗号根据ISO 8601:2004)[25]用作时间元素及其分数之间的分隔符。要表示“14小时30分半”,请不要包括秒数。将其表示为“14:30,5”,“1430,5”,“14:30.5”或“1430.5”。小数部分的小数位数没有限制。但是,通信方需要同意小数位数。例如,在Microsoft SQL Server中,小数部分的精度为3,即“yyyy-mm-ddThh:mm:ss [.mmm]”。[26]
时区指示符
<时间>ž |
<时间>±HH:MM |
<时间>±HHMM |
<时间>±HH |
如果没有给出具有时间表示的UTC关系信息,则假定时间是在本地时间。虽然在同一时区进行通信时假设当地时间可能是安全的,但在用于跨不同时区进行通信时则不明确。即使在单个地理时区内,如果该地区遵守夏令时,某些当地时间也会模糊不清。通常最好使用标准符号表示时区(区域指示符)。
协调世界时(UTC)
如果时间是UTC,则在没有空格的时间之后直接添加Z. Z是零UTC偏移的区域指示符。因此,“09:30 UTC”表示为“09:30Z”或“0930Z”。“14:45:15 UTC”将是“14:45:15Z”或“144515Z”。 ISO 8601时间表示中的Z后缀有时被称为“祖鲁时间”,因为相同的字母用于指定祖鲁时区。然而,定义军事时区列表的ACP 121标准没有提及UTC,并且从格林威治标准时间[27]得出“祖鲁时间”,该时间以前被用作国际民用时间标准。GMT不再由科学界精确定义,可根据具体情况参考UTC或UT1。[28]
UTC的时间偏移
与UTC的偏移量以与“Z”相同的方式附加到时间,格式为±[hh]:[mm],±[hh] [mm]或±[hh]。因此,如果描述的时间比UTC早一个小时(例如冬季柏林的时间),则区域指示符将为“+01:00”,“+ 0100”或简称为“+01”。为了表示UTC后面的时间,偏移是负的。例如,纽约在标准(非夏令时)时间内的时间是UTC-05:00。对于其他时间偏移,请参阅UTC时间偏移列表。为了表示负偏移,ISO 8601指定使用连字符号或减号字符。如果交换字符集有限且没有减号字符,则应使用连字符减号。ASCII没有减号,因此将使用其连字符(代码为45十进制或2D十六进制)。如果字符集有减号,则应使用该字符。Unicode有一个减号,其字符代码是U + 2212(2212十六进制); 在HTML字符实体调用的−。 以下时间均指同一时刻:“18:30Z”,“22:30 + 04”,“1130-0700”和“15:00-03:30”。除了Z之外,不使用航海时区字母。要计算UTC时间,必须从当地时间减去偏移量,例如“15:00-03:30”做15:00 - ( - 03:30)得到18:30 UTC。 除了具有特殊表示“Z”之外,偏移量零也可以用数字表示为“+00:00”,“+ 0000”或“+00”。但是,不允许用带负号的数字表示,如“-00:00”,“ - 0000”或“-00”。指示标志使用的部分(2004年版标准中的第3.4.2节)规定,加号必须用于正值或零值,负号用于负值。与此规则相反,RFC 3339(否则是ISO 8601的配置文件)允许使用“-00”,具有与“+00”相同的表示但具有不同的含义。[29] 当字符集有限时,ISO 8601允许连字符( - )用作减号( - )字符。[30]相比之下,RFC 3339明确要求连字符( - )符号表示负偏移量,并且不允许使用减号( - )符号。[31]
合并的日期和时间表示
单个时间点可以通过连接完整的日期表达式,字母T作为分隔符和有效的时间表达式来表示。例如,“2007-04-05T14:30”。
如果需要时区指示符,则它遵循组合的日期和时间。例如,“2007-04-05T14:30Z”或“2007-04-05T12:30-02:00”。
可以使用基本格式或扩展格式,但日期和时间必须使用相同的格式。日期表达式可以是日历,周或序数,并且必须使用完整的表示。可以使用指定的精度降低的格式来表示时间。[16]允许通过双方协议省略'T'字符。[32]
持续时间
PnYnMnDTnHnMnS |
PNW |
P <日期>Ť<时间> |
持续时间定义了时间间隔中的中间时间量,并由格式P [n] Y [n] M [n] DT [n] H [n] M [n] S或P [n] W表示,如图所示在右边。在这些表示中,[n]被[n]后面的每个日期和时间元素的值替换。前导零不是必需的,但每个元素的最大位数应由通信方同意。大写字母P,Y,M,W,D,T,H,M和S是每个日期和时间元素的指示符,并且不被替换。
- P是在持续时间表示开始时放置的持续时间指示符(用于期间)。
- Y是年份指示符,它遵循年份的值。
- M是月份指示符,它遵循月份的值。
- W是星期指示符,它遵循周数的值。
- D是遵循天数值的日期指示符。
- T是在表示的时间分量之前的时间指示符。
- H是小时指示符,它遵循小时数值。
- M是遵循分钟数值的分钟指示符。
- S是第二个指示符,它遵循秒数的值。
例如,“P3Y6M4DT12H30M5S”表示“三年,六个月,四天,十二小时,三十分钟和五秒”的持续时间。
如果它们的值为零,则可以省略包括它们的指示符的日期和时间元素,并且为了降低精度,也可以省略低阶元素。例如,“P23DT23H”和“P4Y”都是可接受的持续时间表示。但是,必须存在至少一个元素,因此“P”在0秒的持续时间内不是有效表示。但是,“PT0S”或“P0D”都是有效的并且代表相同的持续时间。
为了解决歧义,“P1M”是一个月的持续时间,“PT1M”是一分钟的持续时间(注意时间指示符T,它在时间值之前)。使用的最小值也可能有小数,如“P0.5Y”表示半年。该小数部分可以用逗号或句号指定,如“P0,5Y”或“P0.5Y”。除下文所述之外,该标准并未禁止持续时间表示中的日期和时间值超过其“结转点”。因此,可以使用“PT36H”以及“P1DT12H”来表示相同的持续时间。但请记住,从夏令时切换到夏令时,“PT36H”与“P1DT12H” 不同。 或者,基于组合日期和时间表示的持续时间格式可以通过通信方之间以基本格式PYYYYMMDDThhmmss或扩展格式P [YYYY] - [MM] - [DD] T [hh]的协议使用: [mm]:[ss]。例如,上面显示的第一个持续时间是“P0003-06-04T12:30:05”。但是,个别日期和时间值不能超过其模数(例如,本月的值为13或小时为25的值不允许)。[33] 尽管标准将持续时间描述为时间间隔的一部分(将在下一节中讨论),但持续时间格式与Java 8 Duration类[34][35]一样,与时间间隔无关地广泛使用。
时间间隔
<启动> / <端> |
<启动> / <持续时间> |
<时间> / <端> |
<时间> |
时间间隔是两个时间点之间的中间时间。中间时间量由持续时间表示(如上一节所述)。两个时间点(开始和结束)由组合的日期和时间表示或仅表示日期表示。
表达时间间隔有四种方式:
- 开始和结束,例如“2007-03-01T13:00:00Z / 2008-05-11T15:30:00Z”
- 开始和持续时间,例如“2007-03-01T13:00:00Z / P1Y2M10DT2H30M”
- 持续时间和结束,例如“P1Y2M10DT2H30M / 2008-05-11T15:30:00Z”
- 仅限持续时间,例如“P1Y2M10DT2H30M”,带有其他上下文信息
其中,前三个需要两个由间隔指示符分隔的值,间隔指示符通常是固相线(通常称为正斜杠 “/”)。该标准的第4.4.2节指出:“在某些应用领域,双连字符用作分隔符而不是固相线。” 该标准没有定义术语“双连字符”,但以前的版本使用了诸如“2000--2002”之类的符号。[36]使用双连字符而不是固相法允许包含在计算机文件名中。[37] solidus是保留字符,在常用操作系统中不允许在文件名中。 对于<start> / <end>表达式,如果结束值中缺少任何元素,则假定它们与包括时区的起始值相同。该标准的这一特征允许简洁地表示时间间隔。例如,包括开始和结束时间在内的两小时会议的日期可以简单地显示为“2007-12-14T13:30/15:30”,其中“/ 15:30”表示“/ 2007-12-” 14T15:30“(与开始时间相同),或每月结算期间的开始和结束日期为”2008-02-15 / 03-14“,其中”/ 03-14“表示”/ 2008-03 -14“(与开始的同一年)。
如果需要更高的精度来表示时间间隔,则可以将更多时间元素添加到表示中。表示的间隔“2007-11-13 / 15”可以在任何时间上启动2007-11-13和在任何时候结束2007-11-15,而“2007-11-13T09:00 / 15T17:00”包括开始和结束时间。要明确包括所有开始和结束日期,间隔将表示为“2007-11-13T00:00 / 15T24:00”。
重复间隔
重复间隔在“4.5重复时间间隔”中指定。它们是通过在区间表达式的开头添加“R [n] /”而形成的,其中R用作字母本身,[n]用重复次数代替。省略[n]的值意味着无限次重复。如果间隔指定了开始(上面的表格1和2),那么这是重复间隔的开始。如果间隔指定结束但不指定开始(上面的表格3),那么这是重复间隔的结束。例如,要从“ 2008-03-01T13:00:00Z”开始重复“P1Y2M10DT2H30M”的间隔五次,请使用“R5 / 2008-03-01T13:00:00Z / P1Y2M10DT2H30M”。
截断的表示[ 编辑]ISO 8601:2000允许截断(通过协议),其中省略了日期或时间的主要组成部分。值得注意的是,这允许使用两位数的年份和模糊的格式YY-MM-DD和YYMMDD。该条款已在ISO 8601:2004中删除。
用法[ 编辑]在因特网上,万维网联盟(W3C)使用ISO 8601定义标准的配置文件,该配置文件限制支持的日期和时间格式,以减少错误的机会和软件的复杂性。[38] RFC 3339偏离ISO 8601允许零时区偏移指定为“-00:00”,ISO 8601禁止。RFC 3339打算使用“-00:00”来表示它没有说明首选时区,而符合“+00:00”或任何非零偏移意味着所使用的偏移是优选的。关于“-00:00”的这种约定来自早期的RFC,例如RFC 2822,它将其用于电子邮件标题中的时间戳。RFC 2822没有声称其时间戳格式的任何部分符合ISO 8601,因此可以自由使用此约定而不会发生冲突。 在ISO 8601周日期,截至2006年,出现在它的基本形式在美国的各大品牌的商业包装。它的外观取决于特定的包装,罐装或装瓶厂,而不是任何特定的品牌。该格式对于质量保证特别有用,因此可以很容易地将生产错误追溯到工作数周,并且可以正确地将产品作为召回目标。