【问题标题】:Is it better to present time with offset, or time as UTC? [closed]用偏移量表示时间,还是用 UTC 表示时间更好? [关闭]
【发布时间】:2014-05-06 21:25:18
【问题描述】:

我有一个 Web API,它可以以符合 ISO 8601 的字符串的形式返回时区感知时间数据。我有两个选择,返回带有偏移量的时间数据,以及返回转换为 UTC(祖鲁时间)的时间数据。

例如,我想返回东部时间 2014 年 5 月 6 日下午 5:16:00 的时间。

选项 1:“2014-05-06T17:16:00-04:00”

选项 2:“2014-05-06T21:16:00Z”

哪个是更好的选择?哪个是更受欢迎的选择?

我的客户对任何一种方式都很好。但我想听听您对哪个是更好的选择的看法,以及您的偏好背后的原因。

我认为选项 1 更好,因为它提供了有关时区的额外信息。在此示例中,假设所有各方都在美国,根据日期和 -4:00 偏移量,您知道时区是东部时间。

【问题讨论】:

  • 仅供参考 - 之所以有这么多人投票决定关闭它,是因为您特别询问“哪个更好/更受欢迎”并征求意见。将来,不要问“你认为 X 或 Y 哪个更受欢迎”,而应该尝试更凭经验来表达这个问题,例如“X 相对于 Y 有哪些优点/缺点”。
  • 注明。感谢马特的反馈!
  • 顺便说一句,我不知道有多少人投票结束了这个问题。这个统计数据到底在哪里?

标签: timezone utc iso8601 timezone-offset


【解决方案1】:

这似乎有点基于意见,但根据我的经验,最好始终在后台使用 UTC 进行操作,并且仅在向用户显示时间之前转换为本地时间。

这让你的班级知道的更少,更少的知识是更好的灵活性。在这种情况下,客户端不必知道服务器的时区。此外,如果您有一个不变量,即每个日期时间变量都保存 UTC(表示层除外),它还可以使代码清晰且易于使用。

管理时间和时区通常是错误的来源,这些错误仅在特定时刻出现(例如 DST 更改),因此它可能是意料之外的,并且会在部署几个月后发生。最好让这些部分尽可能简单,并经过全面测试。

【讨论】:

  • 谢谢。假设我不负责向最终用户显示此时间数据。这是 API 使用者的工作。你会说它会给消费者更多的信息,从而更大的灵活性吗?在 .NET 中,如果我们使用选项 2,那么消费者可以根据需要将 Zulu 时间字符串反序列化为 DateTimeOffset 并从中获取 UtcDateTime 以获取 UTC 时间。
  • @Zoomzoom 将其视为国际化/本地化。在您的应用程序内部,您使用诸如“地址”之类的键(如果程序员使用英语)。然后,您的应用会将法语用​​户的该值本地化为“地址”,以便在界面中显示。同样,您通常应该在代码、存储和数据库中使用 UTC 日期时间值。将该日期时间值转换为时区,以便在用户自己的时区中显示。至于您的 API,请类似地考虑; API 会认为将“地址”翻译成“地址”是一个功能还是一个障碍?
  • 谢谢 Basil,这个类比很有趣。虽然我想认为时间+偏移格式不是本地化的,因为“地址”是为法国人本地化的。两种格式都符合 ISO 8601。时间+偏移量格式传达了 Zulu 字符串传达的所有内容,而且更多,不是吗?这就是我正在努力解决的问题。顺便说一句,我在第一条评论中有错字。意思是说“如果我们选择选项 2”。
  • 再次感谢 Bartosz 的意见。 FWIW,我对你的答案投了赞成票。
  • @Zoomzoom 谢谢,祝你好运 :) 回到你的问题 - 我完全同意 BasilBourque 的回答。
【解决方案2】:

这在很大程度上取决于您的 API 试图表示什么。 上下文是关键

  • 如果您只需要表示“发生某事的确切时间点”,则将调整为 UTC 的值发回,并带有尾随 Z

    示例:记录的用户点击您网站上特定页面的时间。

  • 如果您需要表示某事发生在特定当地时间,则发回该当地时间,并带有尾随偏移量。

    示例:员工打卡上班的时间。

这两个选项都是有效的 ISO-8601 格式,并且都代表了不同的时间点。唯一不同的是local+offset格式保留了原来观察者的视角。

另见DateTime vs DateTimeOffset

【讨论】:

  • 你说“唯一的区别是local+offset格式保留了原观察者的视角。”这正是我对选项 2 的论点。就我而言,时间数据可以表示“时间点”(时间戳)或“一天中的时间”(会议时间)。尽管在任何一种情况下,客户当前可能都不关心源位置的时区。但是,将来可能会,所以我认为我会坚持使用时间+偏移量格式。
  • 糟糕,我打错了。意思是说“这正是我对选项 1 的论点”。
猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
相关资源
最近更新 更多