2016-09-20 47 views
0

今天的日期是2016年9月19日。我給它增加了一年,我預計結果將是2017-09-19。相反,我得到2017-09-20。一年加一天。這是行爲嗎?1.year.from_now也提前一天

$ rails c 
2.3.1 :001 > Time.now.to_date.iso8601 
=> "2016-09-19" 
2.3.1 :002 > 1.year.from_now.to_date.iso8601 
=> "2017-09-20" 
+0

http://stackoverflow.com/questions/7957107/why-is-date-today-6-months-6-months-date-today –

回答

1

since或其別名from_now計算基於Time.current偏移量相當於Time.zone.now - 都返回一個ActiveSupport::TimeWithZone實例:

Time.current #=> Mon, 19 Sep 2016 19:56:34 SST -11:00 
Time.zone.now #=> Mon, 19 Sep 2016 19:56:35 SST -11:00 

Time.now另一方面在您的系統的時區返回一個普通的Time實例whi CH可以從Rails的時區不同:

Time.now #=> 2016-09-20 08:56:36 +0200 

爲了避免混淆,內Rails的工作時,你應該總是使用Time.current/Time.zone.now。您可以在另一個 「基準時間」,然而傳遞給since

1.year.since(Time.now) #=> 2017-09-20 08:56:37 +0200 

或者,因爲你正在使用日期:

​​

還有Date.current這相當於Time.zone.today

1.year.since(Date.current) #=> Wed, 19 Sep 2017 
2

原來,這是一個時區的事情。我是UTC -7小時。

Time.now返回我的時區中的時間。

1.year.from_now返回UTC + 0的時間,比我所在的時間早7個小時。

現在是晚上10點,所以它是第二天UTC + 0。

3

如果你想獲得ecactly日期與時間區域,您可以使用Time.current

1.year.from_now 
#=> Wed, 20 Sep 2017 05:38:50 UTC +00:00 
Time.current 
#=> Tue, 20 Sep 2016 05:39:08 UTC +00:00 
+0

看來,我也需要配置我的時區在我的配置。以UTC來做所有事情會更好嗎? –

+0

是的,你應該設置你的時區,但並不難(我編輯我的文章):)即使你沒有這樣做,你總是會得到與你的方法之間的計算完全不同。 –