关于时区:Rails忽略了夏令时

Rails ignore daylight savings time

在夏令时方面,我无法理解Rails的时区支持。

我以UTC格式存储所有数据库时间。 存储用户时区,以便它们直接映射回ActiveSupport::TimeZone值(即Central Time (US & Canada))。

我想完全忽略夏令时。 如果事件从5:30pm开始,则始终从5:30pm开始,无论夏令时是否生效。

考虑到所有时间是否统一存储,是否有可能检索数据库时间并在本地显示它们以便完全忽略夏令时? 有没有问题我会忽视夏令时?


我并不是说听起来很迂腐,但......

I want to completely ignore daylight savings time.

那么,你会独自一人。尽管我们有最大的希望和愿望,但现实世界中的大部分都使用夏令时。你可以在这里获得快速入门。

If an event starts at 5:30pm, it always starts at 5:30pm whether daylight savings time is in effect or not.

5:30为谁?如果你说5:30 UTC,那么肯定。但如果您在美国中部时间说5:30,那么您必须考虑DST。否则,一年半的人会在他们认为是5:30的时候出现在你的活动中,你认为是6:30。

Is it possible, considering all times are stored uniformly, to retrieve database times and display them locally so that daylight savings is completely ignored?

您将时间存储在UTC中,这很好。在本地显示它们时,不应忽略DST。

Are there any problems I am going to run into ignoring daylight savings?

是的,人们通常不了解这一点。一般来说,如果您参考当地时间,那么您的意思是他们的本地时间。如果您在该计算中未包含DST,那么您对于您正在谈论的时间存在分歧。

另一个建议,您可能需要考虑使用TZInfo gem而不是ActiveSupport::TimeZone。然后,您将使用IANA标识符(例如America/Chicago)存储时区选择。这些在Rails之外是可识别的。

由于某些无法解释的原因,ActiveSupport人员认为他们应该将时区限制为他们认为"有意义"的146个值。但是他们没有解释他们的过程,他们似乎没有在维护之上。我问过为什么,但没有得到太多详细的回应。

您可能还希望查看时区标签wiki。


Rails会将您的日期/时间转换为应用程序配置的时区或用户时区(假设您已设置某种过滤器以使用user.timezone);这将包括基于DST的操纵。

您将需要覆盖此行为,可能有几个选项:

  • 考虑使用Time.dst?为了从数据库中提取的内容减去/增加时间
  • 查看在AR中使用skip_time_zone_conversion_for_attributes并通过虚拟属性自行进行转换
  • 将时间存储为日期/时间以外的其他内容;可能是一个单独的字段,只是一个普通的字符串格式的日期