【问题标题】:Converting to local time for Date field in Rails在 Rails 中将日期字段转换为本地时间
【发布时间】:2012-12-20 20:16:46
【问题描述】:

通常我的 webapp 中有日期时间字段,这些字段由 Rails 作为 UTC 时间存储在 postgresql 数据库中。当我在网页上显示这些日期和时间时,它们会显示为当地时间,因为我有类似于以下代码的内容:

before_filter :set_time_zone

def set_time_zone
  Time.zone = "Pacific Time (US & Canada)"
end

效果很好,除了现在我需要将其中一些 datetime 字段转换为数据库中的 date 字段(这很重要)。例如,我可能有学生开始日期的日志:

Log.create(at: began_at, student_id: student_id)

began_at 是一个 datetime 字段。我是否正确设置了 Time.zone 并不重要,at 字段是date,它将存储在 postgresql 中,可能是当地时间提前或落后 1 天。当我去显示那个日期时,它不会被转换为本地时间,这是有道理的......如果我没有存储时间,Ruby/Rails 怎么知道它是本地的哪一天?

我需要的是存储本地日期。所以我需要将began_at 转换为当地时间,然后再将其分配给at。在 Rails 的控制器中执行此操作的正确方法是什么?

我正在使用最新的稳定 Rails(现在是 3.2.9)

【问题讨论】:

  • 我不建议存储本地日期。以 UTC 存储所有内容并根据用户所在的位置显示它:例如使用这个 gem:github.com/basecamp/local_time——其次,如果你想根据日期时间字段进行查询,那么你可能需要传入从客户端提取的时区,并以某种方式将其转换为 UTC。跨度>

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 rails-i18n


【解决方案1】:

尝试在区域中使用 use_zone。

Time.use_zone(zone) do
   log.at = DateTime.parse(params[:at])
 end

【讨论】:

    【解决方案2】:

    给定:began_at 的 UTC 时间戳,比如凌晨 1 点左右

    [1] pry(main)> Time.zone.now.utc.midnight + 1.hour
    => 2012-12-20 01:00:00 UTC
    

    这可以转换为当地时间

    [2] pry(main)> Time.zone.name
    => "Eastern Time (US & Canada)"
    

    使用Time.parse(str)

    [3] pry(main)> x = Time.zone.now.utc.midnight + 1.hour
    => 2012-12-20 01:00:00 UTC
    [4] pry(main)> Time.zone.parse(x.to_s)
    => Wed, 19 Dec 2012 20:00:00 EST -05:00
    

    然后您可以使用 .to_date 将该本地时间戳转换为日期对象

    [5] pry(main)> Time.zone.parse(x.to_s).to_date
    => Wed, 19 Dec 201
    

    然后您可以使用它设置Log:at。现在一起

    Log.create(at: Time.zone.parse(began_at.to_s).to_date, student_id: student_id)
    

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2012-10-07
      • 1970-01-01
      • 2013-08-29
      • 2019-06-21
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2018-08-21
      相关资源
      最近更新 更多