用于查询日期/时间的REST API语义?

时间:2016-11-02 20:36:34

标签: rest datetime express

我有一个node.js应用程序,它在数据库中存储了许多日期。它们以ISO格式存储,例如'2016-11-02T16:30:12-04:00'

某些字段是日期,日期只是日期,其他字段是日期/时间。日期/时间的一个例子是"最后一次修改"记录,一个人的生日只是一个约会。

问题是关于这些事情的存储和查询模式的最佳实践。由于日期总是有时间,因此您必须选择如何存储例如生日。 Following the 5 laws of API dates and times这当然是在UTC中完成的。

虽然适当的API行为似乎不清楚但存在边缘情况。假设有人将生日提交给'2016-11-02T16:30:12-04:00'的API。这是个坏消息,因为像/users?birthdate=2016-11-02这样的搜索会失败,因为该日期将转换为'2016-11-02T00:00:00Z'并且无法在数据库中匹配。那么应该纠正什么行为?

  1. 如果有人POST是用户,请将日期字段转换为UTC午夜的日期,然后让查询生日的约定应该相同吗?
  2. 将某些字段的日期查询转换为隐式范围,即搜索2016-11-02是否真的在寻找2016-11-02T00:00:00Z <= x <= 2016-11-02:23:59:59Z
  3. 仅在确切时刻匹配,并依赖客户知道'2016-11-02T16:30:12-04:00'的生日真的意味着美国东部时间下午4:30,并不仅仅意味着11月2日?
  4. 这里用于区分日期和日期时间的既定模式/最佳实践是什么?

2 个答案:

答案 0 :(得分:1)

我一直在研究REST最佳实践和标准很长一段时间,我不记得读过任何有关它的内容,但是对于ISO标准的使用。从您的描述看,它似乎真的取决于应用程序及其用例。

我会选择#2选项:如果GET请求带有日期但没有时间,请将其视为一整天的查询,并在GET响应服务器代码中执行“转换”。如果准确时间可能偶尔重要,您可能希望同时支持“日期”和单独的“时间”查询字符串参数。这也可以帮助您让客户“不知道”您选择的数据库存储格式,甚至可以允许您支持本地化的日期格式。

答案 1 :(得分:1)

这里的问题是UTC的使用,这意味着有一段时间与之相关。没有,生日被认为(在iCalendar中)是“浮动日期”,并且没有与之相关的特定时间。

如果您的出生日期是11月3日,并且您移居澳大利亚,您的出生日期实际上并没有变为11月2日,因为您的出生日期没有时间,没有时区,并且无论您身在何处世界。

解决方案很简单。如果您允许用户提交生日搜索的日期/时间,那么您应该“切断”时间和时区。假设您只是使用日期部分,只是根据它搜索您的数据库。

理想情况下,您根本不允许用户提交时间。我认为这只会造成混乱。只需强制api客户提交日期。

这些“5条法则”极端过分简化,并不适用于很多情况。