2

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

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

我想完全忽略夏令时。如果一个事件从开始,无论夏令时是否有效5:30pm,它总是开始。5:30pm

考虑到所有时间都是统一存储的,是否有可能检索数据库时间并在本地显示它们,从而完全忽略夏令时?忽略夏令时会遇到什么问题吗?

4

2 回答 2

5

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

我想完全忽略夏令时。

好吧,那你就靠自己了。尽管我们抱有最大的希望和愿望,但现实世界的大部分时间都在使用夏令时。 你可以在这里快速入门

如果事件在下午 5:30 开始,则无论夏令时是否有效,它总是在下午 5:30 开始。

5:30 给谁?如果您说的是世界标准时间 5:30,那么当然可以。但是,如果您说的是美国中部时间的 5:30,那么您必须将 DST 考虑在内。否则,半年的时间人们会在他们认为是 5:30 而你认为是 6:30 出现在你的活动中。

考虑到所有时间都是统一存储的,是否有可能检索数据库时间并在本地显示它们,从而完全忽略夏令时?

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

忽略夏令时会遇到什么问题吗?

是的,人们通常不理解这一点。通常,如果您指的是当地时间,那么您的意思是对他们来说是当地的时间。如果您在该计算中不包括 DST,那么您将对您所谈论的时间产生分歧。

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

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

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

于 2013-09-04T00:06:06.197 回答
1

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

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

  1. 考虑使用 Time.dst?为了减少/增加从数据库中提取的时间
  2. 研究在 AR 中使用 skip_time_zone_conversion_for_attributes 并通过虚拟属性自己进行转换
  3. 将时间存储为日期/时间以外的其他内容;可能作为普通字符串格式的日期的单独字段
于 2013-09-03T22:16:52.293 回答