2012-11-12 172 views
3

我有时区设置。时间和日期时间之间的Rails时区差异

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 

我不小心使用了使用时间

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

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

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

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

使用时间真的没有什么大不了的,但是我需要手动补偿任何时候我使用DateTime,并希望它在正确的区域?

回答

7

是的。 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

+1

感谢。你能指出我在哪里有记录吗?我没有看到它在API码头中提到。 – kjs3

+0

我添加了文档的链接。对于'DateTime.new',偏移的默认值是'0'。 – vladr