1

也许这个问题应该分成两篇文章,但我目前有几个商业客户的 API。我目前正在使用带有 UTC 时区的 ISO 8601 时间戳来表示时间。但是,我不喜欢将这些时间戳附加到任何时区的想法,因为无论您在哪个时区,时间都应该相同。5PM UTC 应该是 5PM CST,等等......

我知道您可以将 Z 从 ISO 时间戳中去掉,它将被解释为您所处的任何本地时间。这样可以吗?如果是这样,我如何在 Ruby 中做到这一点?我阅读了 Time 课程的文档,但对此一无所知。

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

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

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

4

1 回答 1

1

我不知道您所说的“无论您在哪个时区,时间都应该相同。UTC 下午 5 点应该是中部标准时间下午 5 点,等等。”。UTC 时间下午 5 点显然不是CST 下午 5 点!

无论如何,我不认为你提出的做法是一个好的做法。假设您Z省略了时间戳并将时间戳解释为您所在的任何本地时间。由于这是一个网络 API,客户端和服务器可能不在同一个时区。当客户端提交“本地”时间时,这意味着什么?客户端的本地时间(如果是,服务器如何知道那是什么?)?服务器上的当地时间?这是模棱两可的。这就是为什么唯一合理的做法是始终使用 UTC 的关键所在。

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

但是,它确实取决于您的时代代表什么。例如,在“春分时,日落发生在 18:00”中,使用不受时区限制的抽象时间是有意义的(在每个时区都是如此,和/或您正在谈论太阳时)。但是在这个抽象时间上加上一个日期没有什么意义,所以我认为在这种情况下你不会谈论 ISO8601。

于 2012-11-04T22:50:08.123 回答