【问题标题】:Rails timezone differences between Time and DateTimeRails Time 和 DateTime 之间的时区差异
【发布时间】:2025-11-30 19:45:01
【问题描述】:

我设置了时区。

config.time_zone = 'Mountain Time (US & Canada)'

从控制台创建圣诞节活动...

c = Event.new(:title => "Christmas") 

使用时间:

c.start = Time.new(2012,12,25)  
=> 2012-12-25 00:00:00 -0700 #has correct offset  
c.end = Time.new(2012,12,25).end_of_day  
=> 2012-12-25 23:59:59 -0700 #same deal  

使用日期时间:

c.start = DateTime.new(2012,12,25)  
=> Tue, 25 Dec 2012 00:00:00 +0000 # no offset  
c.end = DateTime.new(2012,12,25).end_of_day  
=> Tue, 25 Dec 2012 23:59:59 +0000 # same  

我一直在粗心地使用 DateTime 认为输入被假定在 config.time_zone 但是当它被保存到数据库时没有转换。它的存储方式与返回值相同(为 db 格式化)。

使用时间确实没什么大不了的,但我是否需要在使用 DateTime 的任何时候手动偏移并希望它位于正确的区域?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 datetime time


    【解决方案1】:

    是的。 Time.new 将在没有特定时区的情况下将参数解释为本地时间,DateTime.new 将在没有特定时区的情况下将参数解释为 UTC。如文件所述。您可能希望将 Time.new 替换为 Time.local,以便在整个代码中保持清晰。

    您可以做的是使用DateTimemixins for Time 调用Time.local(2012,12,25).to_datetime。但是,如果年/月/日来自用户/浏览器,那么也许您应该获取用户/浏览器的时区,而不是使用服务器的时区。

    如果您需要创建迁移来修复数据库中的现有数据,new_date_time = Time.local(old_date_time.year, old_date_time.mon, old_date_time.mday, old_date_time.hour, old_date_time.min, old_date_time.sec).to_datetime

    【讨论】:

    • 谢谢。你能指出我记录在哪里吗?我没有在 api 坞站中看到它。
    • 我添加了文档的链接。对于DateTime.new,偏移量的默认值为0