【问题标题】:What's the best way to convert a Date to a DateTime in the current timezone in Rails 4?在 Rails 4 的当前时区中将日期转换为日期时间的最佳方法是什么?
【发布时间】:2015-08-20 00:35:12
【问题描述】:

我正在使用 Rails 4.2。我有一个Date,我想将其转换为DateTime。如果我使用现有的 to_datetime 方法,它会将其转换为 GMT。 (我已经看了大约一个小时的线程,找不到这个确切的问题,所以如果它存在,请提前道歉!)

irb(main):030:0> Date.current
=> Wed, 19 Aug 2015
irb(main):031:0> Date.current.to_datetime
=> Wed, 19 Aug 2015 00:00:00 +0000

如果我尝试使用in_time_zone,它会将其转换为当前时区,但还会从日期中减去偏移量。

irb(main):032:0> Date.current.to_datetime.in_time_zone
=> Tue, 18 Aug 2015 17:00:00 PDT -07:00

如何将现有的Date 转换为当前时区的DateTime

【问题讨论】:

  • 什么是“正确的”时区? Time.zone 返回什么?
  • 从“正确”更改为“当前”,即 PST。
  • 那么Time.zone 会返回PST 吗?

标签: ruby-on-rails date datetime


【解决方案1】:

这是我能想到的最佳答案。

Time.zone.at(Date.current.to_time).to_datetime

【讨论】:

  • Date.current.to_time 实际上默认使用本地时区,所以 Date.current.to_time.to_datetime 应该是一样的。
  • 谢谢!将其编辑为答案
  • 但是本地时区可能与在application.rb 中使用配置设置的rails 时区不同,所以我认为Time.zone.at 在rails 环境中可能仍然是一个更好的选择
  • 哦,这是一个非常好的观点——我想这就是我最终没有使用它的原因,因为它在本地对我有用,但在产品中却不行。
  • 这不会返回当前时区的开始时间。它根据当地时区偏移。请参阅 Kelly Corrigan 的回答。
【解决方案2】:

接受的答案对我不起作用,因为 Date.current.to_time 将日期转换为我的 :local 时区,即 UTC,而不是我配置的时区,即 PST。

相反,我使用了Date.current.in_time_zone.to_datetime,我在这里找到了它:https://www.varvet.com/blog/working-with-time-zones-in-ruby-on-rails/

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,我这样做了:

    Time.use_zone("Europe/Berlin") do
      midnight = Time.zone.parse(@date.to_s)
    end
    

    这基本上将日期重新创建为 Time 实例,同时处于目标时区,在午夜,而不“移动” Time 实例。

    【讨论】:

    • 这个对我有用,但我不必使用Time.use_zone 块,因为应用程序已经配置了正确的时区。基本上是beginning_of_day = Time.zone.parse(@date.to_s)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2013-03-17
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多