1.year.from_now也提前一天

时间:2016-09-20 05:33:33

标签: ruby-on-rails ruby

今天的日期是2016-09-19。我加了一年,我希望结果是2017-09-19。相反,我得到2017-09-20。一年加一天。这种行为是否符合预期?

$ 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" 

3 个答案:

答案 0 :(得分:3)

如果您希望与时区保持紧密约会,可以使用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

答案 1 :(得分:2)

原来这是一个时区的事情。我是UTC -7小时。

Time.now返回我的时区中的时间。

1.year.from_now以UTC + 0的速度返回时间,比我的位置提前7小时。

现在是晚上10点,所以第二天是UTC + 0。

答案 2 :(得分: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实例,该实例可能与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

或者,因为您正在处理日期:

1.year.since(Date.today) #=> Wed, 20 Sep 2017

还有Date.current相当于Time.zone.today

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