REST GET API的建议日期格式


105

像这样的REST GET API推荐的时间戳格式是什么:

http://api.example.com/start_date/{timestamp}

我认为实际的日期格式应为ISO 8601格式,例如YYYY-MM-DDThh:mm:ssZUTC时间。

我们是否应该使用没有连字符和冒号的ISO 8601版本,例如:

http://api.example.com/start_date/YYYYMMDDThhmmssZ

还是应该使用例如base64编码对ISO 8601格式进行编码?


为什么不按原样使用ISO 8601格式呢?
约翰内斯

@Johannes ISO 8601格式(在没有连字符和冒号的版本中)是可以的,我只是想知道是否存在一种推荐的方法来表示URL中的日期
Lorenzo Polidori 2012年

Answers:


77

REST没有推荐的日期格式。实际上,归结为最适合您的最终用户和系统的东西。就个人而言,我想坚持使用像ISO 8601(URL编码)一样的标准。

如果没有丑陋的URI是一个问题(如不包括的URL编码版本:-你URI)和(人类)寻址并不重要,你也可以考虑划时代时间(例如http://example.com/start/1331162374)。该URL看起来更简洁一些,但是您肯定会失去可读性。

/2012/03/07是您经常看到的另一种格式。我想你可以扩大一下。如果您走这条路,只需确保您总是处于格林尼治标准时间(GMT)时间(并在文档中清楚说明),或者您可能还想包括某种时区指示器。

最终,归结为适用于您的API和最终用户的功能。您的API应该对您有用,而不是对您有用;-)。


12
谢谢,非常有用的答案。我想我会选择ISO 8601(即http://api.example.com/start_date/YYYYMMDDThhmmssZ)的压缩版本,该版本对可读性和干净的URL都有好处。
洛伦佐·波利多里

7
但是JSON 确实有推荐的日期格式,并且它是ISO 8601 :)
Radu Potop 2012年

@stalemate Date对象默认情况下序列化为包含ISO格式日期的字符串。developer.mozilla.org/zh-CN/docs/JSON
Radu Potop

5
@RaduPotop是的,但这是我们正在谈论的HTTP和URI标准。我不确定JSON与它有什么关系。
nategood 2012年

3
我只想指出,连字符不需要进行URL编码。
user128216 '16

97

此处查看有关API日期和时间的5条定律:

  • 法律1:使用ISO-8601作为日期
  • 法则2:接受任何时区
  • 法则3:将其存储在UTC中
  • 法则4:以UTC退还
  • 法则5:如果您不需要时间,请不要使用时间

文档中的更多信息。


2
-1,因为2017-11-20T11%3A00%3A00Z它不是很可读。同样(特定于IIS),即使对URL中的冒号进行了编码,这似乎也很偏执。
伊恩

2
此链接-agiletribe.wordpress.com/2015/06/10/jsonrest-api-handling-dates建议使用整数纪元,以避免iso-8601格式可能遇到的人类可读性问题。让我知道您是否有不同的看法。
安迪·杜弗雷斯

5
请注意,连字符和点在URL中不是保留字符。仅冒号需要URL编码(en.wikipedia.org/wiki/Percent-encoding)。在ISO-8601(en.wikipedia.org/wiki/ISO_8601)中,连字符是必需的,但冒号是可选的。因此,如果需要更高的精度,则在URL中使用的正确ISO-8601变体为YYYY-MM-DDThhmmssZ和YYYY-MM-DDThhmmss.mmmZ。
布鲁斯·亚当斯

一篇经常链接并引起激烈争论的文章。尽管我同意选择可排序格式(如果必须全部为字符串),但unix时间戳(本文甚至不承认)具有上述所有优点。在进行演示之前,甚至都不存在时区和夏令时(以及政治决策)的问题。
kaay

18

RFC6690-受约束的RESTful环境(CoRE)链接格式第2部分中未明确说明日期格式。链接格式指向RFC3986。这意味着应使用RFC 3986中的日期类型建议。

基本上Internet上的RFC 3339日期和时间是要查看的文件,其中说:

Internet协议中使用的日期和时间格式,它是ISO 8601标准的配置文件,用于使用公历表示日期和时间。

归结为:YYYY-MM-ddTHH:mm:ss.ss±hh:mm

(例如1937-01-01T12:00:27.87 + 00:20)

是最安全的选择。


12

输入/输出中的每个datetime字段都必须采用UNIX / epoch格式。这避免了API不同方面的开发人员之间的混乱。

优点:

  • 纪元格式没有时区。
  • Epoch具有单一格式(Unix时间是单个带符号的数字)。
  • 夏时制不会影响时间。
  • 大多数后端框架和所有本机ios / android API支持时代转换。
  • 本地时间转换部分可以完全在应用程序侧完成,具体取决于用户设备/浏览器的时区设置。

缺点:

  • 转换为UTC并以UTC格式存储在数据库中的额外处理。
  • 输入/输出的可读性。
  • GET URL的可读性。

笔记:

  • 时区是表示层的问题!您的大多数代码都不应处理时区或本地时间,而应该传递Unix时间。
  • 如果要存储人类可读的时间(例如日志),请考虑将其与Unix时间(而不是Unix时间)一起存储。

1
完全同意。
Jorge.V,

1
我唯一要添加的是从一开始就考虑是否需要考虑系统中任何位置的毫秒数。如果是这样,请使用毫秒级的Unix时间戳。
jamesjansson19年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.