在基于Ruby的REST API中表示本地时间戳

时间:2012-11-04 20:31:44

标签: ruby timestamp api-design

也许这个问题应该分成两个帖子,但我目前有一些API供一些商业客户使用。我目前正在使用ISO 8601时间戳和UTC时区来表示时间。但是,我不喜欢这些时间戳附加到任何时区的想法,因为无论你在什么时区,时间应该是相同的。下午5点UTC应该是下午5点CST等...

我知道您可以将Z从ISO时间戳中删除,并且它将被解释为您所在的当地时间。这是可行的吗?如果是这样,我如何在Ruby中执行此操作?我阅读了Time类的文档,并没有看到任何关于此的内容。

编辑:让我重新说一下这句话,或至少澄清一些事情。我正在寻找没有附加到时区的时间戳的原因正是因为我知道我的客户端服务器和API服务器几乎不会匹配。如果客户端正在提交带有时间的事件,则该时间需要模糊地等于用户正在处理的事件特定的模糊区域设置。

这是一个满口的......假设我正在研究一个事件调度程序。每个事件都属于公司的店面或位置。当为某个位置显示时间时,假设显示的时间位于该位置的时区中,并且为了清楚起见,不应该在格式化为用户的本地时区的时间显示。如果我正在查看东海岸的调度程序,但查看西海岸地区的事件,我应该看到的时间应该是西海岸地区的当地时间,而不是根据我的时区进行调整。

我知道一个解决方案可能是简单地存储与其关联的位置的时区信息。但是用户希望将时间转换为他们的时区的用例非常罕见,我宁愿让我的API更容易实现...这实际上是我原来的实现,但在许多不同的环境和多个环境中实现API编程语言很明显,对于很多语言来说,显示时间戳的时区是一个障碍。如果用户想要将时间转换为其本地时区,我可以轻松地存储位置对象本身的全局时区信息。

1 个答案:

答案 0 :(得分:1)

我不知道你的意思是“无论你在什么时区,时间应该是相同的。下午5点UTC应该是下午5点CST等。”。明天下午5点,不是 5PM CST!

无论如何,我认为你提出的建议并不合适。假设您不使用Z并将时间戳解释为您所在的当地时间。由于这是一个网络API,因此客户端和服务器可能不在同一时区。当客户提交“本地”时间时,这是什么意思?客户端上的本地时间(如果是这样,服务器如何知道它是什么?)?服务器上的本地时间?这是模棱两可的。这就是为什么唯一合理的事情就是始终使用UTC。

可以做的事情是将时区附加到时间戳(如果它可能相关)。例如,“你应该在2012-11-10T22:00:00Z观察一分钟的沉默,以纪念在第一次世界大战中死去的士兵”听起来很奇怪,因为Rememberance Day不是11月10日! “你应该在2012-11-11T11:00:00 + 13:00观察一分钟的沉默”一旦你把新西兰时区放在那里听起来好多了......在这种情况下你可以保持和时间戳(在本地或UTC)以及时区偏移(例如,将它们一起存储在数据库中)。

但是,它取决于你的时代代表什么。例如,在“在昼夜平分点,日落发生在18:00”,使用不符合时区的抽象时间是有意义的(在每个时区都是如此,和/或你在谈论太阳时)。但是将日期附加到这个抽象时间是没有意义的,所以在这种情况下我不认为你会谈论ISO8601。