【问题标题】:Rails TimeWithZone and leap yearsRails TimeWithZone 和闰年
【发布时间】:2016-02-29 15:21:53
【问题描述】:

今天是 2 月 29 日:我们的测试结束的那一天。

我们的测试失败了,因为这些测试最终所做的事情可以与这样的命令进行比较:Time.zone.now - 1.year + 1.year。它恰好等于Time.zone.now

为什么会这样?为什么 ActiveSupport 不能在这样的计算中处理闰年?它不能与时间戳一起使用,从而防止此类问题的发生吗?

【问题讨论】:

  • 如果你今天测试它,你运气不好......今天是 2 月 29 日,每 4 年存在一次。所以Time.zone.now + 1.year 将带您到 2 月 28 日,因为 2017 年不存在 29 日。1.year.from_now 也将返回 2017 年 2 月 28 日
  • 是的,我明白了。但是,例如,为什么Time.zone.now + 1.year 不等于 3 月 1 日?在我看来,这会更合适。
  • Time.zone.now - 365.days + 365.days 似乎工作...

标签: ruby-on-rails activesupport


【解决方案1】:

您可以使用 4 年而不是 1 年来获得相同的效果。 (注:- 1.day 因为现在是 3 月 1 日)

(Time.zone.now - 1.day) - 4.year + 4.year
 => Mon, 29 Feb 2016 15:12:58 UTC +00:00

可能值得注意的是(如下),无论日期如何。

Time.zone.now
 => Tue, 01 Mar 2016 15:11:51 UTC +00:00 
Time.zone.now == Time.zone.now - 1.year + 1.year
 => false 

除非你使用 begin_of_day:

(Time.zone.now - 1.day).beginning_of_day == ((Time.zone.now - 1.day) - 4.year + 4.year).beginning_of_day
 => true 

另外,这取决于您实际尝试做什么...您为什么要测试Time.now - 1.year + 1.year

还有……

1.year == 365.days
 => false 
1.year == 365.25.days
 => true 

【讨论】:

  • Time.zone.now == Time.zone.now - 1.year + 1.year 将永远无法工作,您必须将Time.zone.now 存储在变量中。
  • 是的,没错,但它适用于日期:Date.today == Date.today - 1.year + 1.year
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多