【问题标题】:Rails ignore daylight savings timeRails 忽略夏令时
【发布时间】:2013-09-03 22:02:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你有办法吗?我确实有需要忽略时区的情况(发送数据的设备不会将其小时更改为 DST,因此我们收到的所有数据都有 1 小时的偏移量)。

标签: ruby-on-rails timezone


【解决方案1】:

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

我想完全忽略夏令时。

好吧,那你就靠自己了。尽管我们抱有最大的希望和愿望,但现实世界的大部分时间都在使用夏令时。 You can get a quick primer here.

如果活动在下午 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 个值。但是他们没有解释他们的过程,而且他们似乎没有在维护之上。 I've asked why,但没有得到太多详细的回复。

您可能还希望查看the timezone tag wiki

【讨论】:

  • 你是 100% 正确的!我发现在我开始项目之前编写了一些旧代码,并且开发人员在将其存储在UTC 之前强制时区偏移。该代码查找给定时区的偏移量,并强制该偏移量无论插入的时间是否在 DST 中(或者它取决于 Date/Time.now 值来计算 DST 偏移量)。我修复了代码,并且所有日期都被正确插入。非常感谢您清除了对 DST 的需求。
  • 没问题。日期/时间问题很难。许多真正伟大的开发者仍然会出错。以后有没有其他顾虑再问!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2013-09-03
    • 2014-09-21
    • 1970-01-01
    • 2011-10-31
    • 2018-08-22
    • 2018-12-14
    • 2013-01-12
    相关资源
    最近更新 更多