如果 UTC 时间戳可用,时区信息是否多余?

Is timezone info redundant provided that UTC timestamp is available?

我有一个简单的移动应用程序,可以在指定位置安排人们之间的未来事件。这些事件可能是物理的或虚拟的,因此为事件指定的时间 可能会或可能不会 与事件的 'location' 在同一时区。例如,可以为伦敦的两个人安排在指定日期的当地时间上午 10 点举行的实体会议。或者,可以在指定日期的下午 4 点(在一个人的时区)为两个不同时区的人安排 Skype 通话,尽管事件的 'location' 只是 'office',这意味着两个不同的地方在不同的地方时区。

我想知道以下设计是否适用于此应用程序:

  1. 在客户端,它要求用户输入本地日期和时间并指定事件本地的时区。

  2. 在服务器上,将本地日期和时间与提供的时区转换为UTC时间戳,并仅存储此时间戳。

  3. 当客户端检索这些详细信息时,它仅接收 UTC 时间戳并将其转换为与客户端当前时区相同时区的本地时间。客户端的当前时区是由当前系统时区设置决定的,我认为是根据客户端的位置自动调整的(当然,假设客户端连接到移动网络)。

我进行此设计的主要动机是:

  1. UTC 是一个绝对的通用时间标准,您可以将其to/from转换为from/to任何时区。

  2. 用户只关心他们当前所在时区的本地日期和时间。

这个设计可行吗?如果不是,哪些特定场景会破坏应用程序或严重影响用户体验?欢迎批评。

对于单个事件,知道它发生的 UTC 时刻通常就足够了,只要您有正确的 UTC 时刻(见下文)。

对于重复事件,您需要知道它重复的时区...不仅仅是UTC偏移量,还有实际时区。例如,如果我安排每周在 Europe/London 下午 5 点与 America/Los_Angeles 的同事开会,那么对于一年中的 大多数 ,他们将在上午 9 点召开会议。 .. 但一年中有几个星期会在上午 8 点发生,一年中有几个星期会在上午 10 点发生,因为夏令时的观察时间不同。

即使是单个事件,您也可能需要考虑如果时区规则发生变化会发生什么。假设我在 Europe/London 时区的 2018 年 3 月 20 日下午 4 点安排了一次会议。 目前 UTC 偏移量为 0...但假设从现在到会议之间,时区规则更改为将英国夏令时提前一小时。如果我在日记中将其写为下午 4 点,我可能不希望软件认为它实际上是下午 5 点,因为那是我们最初预测的 UTC 时刻。

我们不知道您的确切应用需求,但上述情况至少为可能存储本地时间和时区而不是 UTC 时刻提供了论据。 . 但是你 需要弄清楚如果本地时间最终被跳过或由于 DST 更改而变得不明确时该怎么办。 (当时钟回落时,一些本地时间会出现两次。当时钟向前跳时,一些本地时间会被跳过。如果规则在最初的计划时间和实际事件。您可能应该在设计中考虑到这一点。)

为简单起见,我的答案是:

  • 如果您想定义一个时刻,时区信息是多余的。一种 UTC/Unix时间戳完全定义了一个时刻。
  • 您的设计似乎可行,但关于第 2 点:我会在客户端转换为 UTC/Unix 时间戳,并且已经给出了该时间戳 以最终形式发送到服务器。原因:客户端已经有转换所需的信息(参见这个 time-keeping 客户端服务器数据库 架构 示例 - 它完全根据您描述的原则工作)。

  • 一个可能的问题(如 Jon Skeet 在他的回答中所述)是重复发生的事件,但这应该反映在您建模的方式中 时间。重复事件和固定事件之间的区别是 后者完全定义了一个时刻(比如 UTC/Unix 时间戳),而第一个只是可以应用的 'function' 到当前时间得到循环的下一次触发时间 事件。但这可能是一个完全不同的问题 你问 - 在任何情况下,以某种方式区分重复出现 事件(如果你需要的话)和模型中的固定事件是一个很好的 想法。

  • 要做出的一个决定是:拉还是推?或两者?您是否希望服务器能够发送电子邮件,例如,当事件发生时 经过?或者您是否仅在客户端时才需要客户端警报 应用是 运行?这些问题的答案将帮助你来 寻找适合您的设计。