【问题标题】:Daylight Savings Time ignored using in_time_zone Rails 4使用 in_time_zone Rails 4 忽略夏令时
【发布时间】:2016-04-12 20:50:54
【问题描述】:

我遇到了一个令人沮丧的问题,我似乎无法缩小范围。我搜索了许多类似的文章,但它们离我的问题还不够近,无法解决。我正在尝试从数据库中提取时间并将其显示在多个时区中。我的 Rails 应用程序默认使用 UTC。这是我正在做的事情:

在创建操作时,我将时间字符串保存在我的数据库的时间列中:

params[:schedule][:start] = "09:00"
Time.zone = "Central Time (US & Canada)"
@schedule.start = Time.zone.parse(params[:schedule][:start])

上面的时间格式应该是这样的:

2016-04-12 09:00:00 -0500

这在数据库中保存为:

2000-01-01 14:00:00

这没有时间偏移,这很好,因为我知道它是 UTC。当我去显示时间时会出现问题:

@schedule.start.in_time_zone("Central Time (US & Canada)")

这会返回:

Sat, 01 Jan 2000 08:00:00 CST -06:00

现在,由于这是一个时间列,我不关心日期。我计划将值格式化为仅显示时间。但是,当它当前是 CDT 时,它显示 CST。

我不知道为什么会这样。正如我所说,我没有在 application.rb 或其他任何地方设置时区,我只在创建操作上设置时区,这在移动到新操作时应该没问题。

任何关于澄清这一点的帮助都会很棒!

这似乎是因为在存储时间时,它与 2000-01-01 年的日期一起存储,这似乎是它使用 CST 的原因。如何在将日期转换为特定时区时忽略日期,还是需要将列类型更改为 DateTime 才能使其正常工作?

【问题讨论】:

  • 遇到同样的问题。本质上,in_time_zone 考虑了提供的DateTime 的日期以及该时区在提供的DateTime 的日期和时间是否处于夏令时。这非常令人困惑。因为我目前不在夏令时,所以我想在我当前的时区(或偏移量)中查看此信息,而不是在相关DateTime 的时区(或偏移量)中查看。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

显示 CST 只是因为时间是从数据库中读取的包括存储的日期,即读取为 2000 年 1 月 1 日 09:00。

我猜你必须在读回属性时解析时间。您可以在模型中使用辅助方法,例如:

# schedule model
def start_in_zone(zone)
  self.start.strftime("%H:%M").in_time_zone(zone)
end

这将只占用存储时间的小时和分钟部分,并在给定的时区解析它,并将日期设置为今天。看这个例子:

"Sat, 01 Jan 2000 08:00:00".to_time.
     strftime("%H:%M").
     in_time_zone("Central Time (US & Canada)")
# => Tue, 12 Apr 2016 08:00:00 CDT -05:00

【讨论】:

    【解决方案2】:

    无论是 CST 还是 CDT 都很重要,这意味着您在某种程度上确实关心日期。虽然我不熟悉该地区夏令时的确切规则,但我知道 1 月 1 日是冬季中期,绝对不会是夏令时。

    将相关日期添加到您的@schedule,然后再将其放入时区,它应该可以解决问题。

    【讨论】:

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