2013-02-25 97 views
0

我在巴西,距离UTC有-3个小时。 我没有做对Rails的时区的任何配置,我的控制台行为怪异,这里是例子:Rails中奇怪的ActiveRecord时区行为

1.9.3p194 :099 > FreeTime.first.starts_at 
    => 2000-01-01 11:15:26 UTC 
    1.9.3p194 :100 > FreeTime.first.starts_at.localtime 
    => 2000-01-01 09:15:26 -0200 
    1.9.3p194 :101 > FreeTime.first.starts_at.localtime.zone 
    => "BRST" 
    1.9.3p194 :102 > Time.now 
    => 2013-02-25 10:24:51 -0300 
    1.9.3p194 :103 > Time.now.zone 
    => "BRT" 
    1.9.3p194 :104 > Time.zone 
    => (GMT+00:00) UTC 

正如你所看到的,问题是Rails的时间类计算出正确的我localzone(从我的系统时钟),但ActiveRecord不知何故错误。我想知道为什么ActiveRecord错误地认为我的时区是BRST(正确的是BRT),即使我没有做任何配置。

回答

2

它没有得到任何错误。它意识到你在巴西时区,而在2000-01-01 11:15:26 UTC,巴西时区是在BRST,即UTC-2。

the year 2000,BRST - > BRT过渡是在2月26日。

您需要了解您的时区不是真正的“BRT”或“BRST” - 它们是两者的组合,包括它们之间的转换。例如,我在英国。我们目前在格林威治标准时间,我们将在夏季过渡到BST - 因此夏季时间值的正确输出为BST,UTC + 1。

+0

很好的回答!我开始意识到在数据库上拥有一个Time字段的最佳方法是使用Integer for Hour和Integer for Minutes。由于我在巴西,每次存储时间时,都会在2000-01-01,因此出现在错误的时区。 – alexandrecosta 2013-02-25 14:36:48

+0

@ user1261084:说实话,这很少是开始时间的最佳方式。在大多数情况下,将值存储为UTC是写入方法 - 最好存在将本地日期/时间与时区一起存储的情况。 – 2013-02-25 14:40:13

+0

如果我每个星期二在15:00预约,夏季它将继续在15:00。但是,如果我将它作为“15:00:00 -0300”存储在数据库中,夏季时它会让我知道约会是在“16:00:00 -0200”。非常混乱......时间是时间,因为很多情况下它不依赖于区域。 DateTime依赖区域。我不明白为什么Rails坚持在Time数据库属性中记录日期。它应该有一个更好的方法来避免这种混淆。现在我将时间存储为“11:00:00 -0300”,并且让我回到“11:00:00 -0200”:https://gist.github.com/anonymous/5030404 – alexandrecosta 2013-02-25 15:06:54