2016-09-20 50 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

是的,你应该设置你的时区,但并不难(我编辑我的文章):)即使你没有这样做,你总是会得到与你的方法之间的计算完全不同。 –