使用固定时间范围时如何处理 Rails 中的时区

How to handle timezones in Rails when using fixed time ranges

我觉得我要绕着房子转一圈。

总而言之,我有一个具有开放时间的位置模型,在数据库中建模为 opens_atcloses_at

所有时间都以 UTC 格式存储在数据库中。

如果我在纽约创建一个位置,在我的表单中将 opens_at 设置为 08:30,并且它作为 08:30 UTC 保存到数据库中,我为什么需要担心关于时区?我不想以当地时间显示时间,因为用户会看到 03:30.

的营业时间

我是不是想多了?如果我有多个国家的用户同时参加同一活动,我是否只需要担心时区问题?

因为这是关于物理位置的,所以我觉得不需要它。

是的,我实际上 运行 参与其中。如果用户只是想看到本地时区的时间,那么实际上没有必要保存为带时区的 UTC。您可以将其保存为不带时区的本地时间。

参考:Postgres Time without Time Zone

有些开发人员会说您应该将其保存为带有时区的 UTC,但我可以看到两个反对意见:

  1. 如果你现在不需要它,你可能永远也不需要它。
  2. 您现在可能无法访问时区,或者可能需要额外的 code/complexity 来实施和验证。
  3. 如果您知道时区或 lat/lon 或地址,您可以稍后添加。

If I create a location in New York with opens_at set at 08:30 in my form and it gets saved to the DB as 08:30 UTC, why would I need to worry about timezones?

因为纽约的 08:30 不是 08:30 UTC。它甚至不是所有日期的同一时间。

  • 当纽约遵守东部标准时间(EST,UTC-5)时,它是 13:30 UTC
  • 当纽约遵守东部夏令时(EDT,UTC-4)时,它是 12:30 UTC

因此,如果该地点每天都在同一时间开放,那么您必须以当地时间存储它。否则,在下一个 DST 转换后,您将以某种方式离开一个小时。

即使对于不使用 DST 的时区,甚至对于非经常性事件,这也可能是个问题,因为世界各国政府都在其边界内控制时区。他们可以更改是开始观察 DST 还是停止观察它、DST 转换发生的日期和时间,或者他们与 UTC 的标准偏移量。有些人在进行此类更改时会给予足够的通知,而其他人则不会。在您最初记录事件和事件发生之间,给定时区可能 改变 其行为的可能性总是非零的。如果您使用当地时间记录,则您需要做的就是更新系统上的时区数据(这通常会自动发生)。但是,如果您使用 UTC 记录事件,那么在这样的更改后转换 back 时可能会关闭。

一般来说,未来事件应该总是按照事件被描述的方式存储——这几乎总是在本地时间一些特定的时区。将 IANA time zone ID(例如 "America/New_York")与位置或事件一起存储,以便您可以在需要时进行转换,但过早转换为 UTC 可能会导致看不到原始信息。

过去现在 事件保存“始终使用 UTC”的心态,例如为交易添加时间戳。