Rails时间和日期时间之间的时区差异

kjs*_*js3 3 ruby time datetime ruby-on-rails ruby-on-rails-3

我有时区设置.

config.time_zone = 'Mountain Time (US & Canada)'
Run Code Online (Sandbox Code Playgroud)

从控制台创建圣诞节事件......

c = Event.new(:title => "Christmas") 
Run Code Online (Sandbox Code Playgroud)

使用时间:

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  
Run Code Online (Sandbox Code Playgroud)

使用DateTime:

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  
Run Code Online (Sandbox Code Playgroud)

我不小心使用DateTime认为输入被假定在config.time_zone中,但是当它被保存到db时没有转换.它的存储方式与返回值(格式化为db)相同.

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

vla*_*adr 8

是的.Time.new将在没有特定时区的情况下将参数作为本地时间进行解释,并DateTime.new在没有特定时区的情况下将参数作为UTC进行解释.如记录.您可能需要更换Time.newTime.local对整个代码的清晰度.

你可以做的是使用DateTime混入的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