在Rails中,为什么1.year.from_now与1.year.to_i.seconds.from_now不一样?

djb*_*djb 8 ruby ruby-on-rails dst

我可以让Rails在几秒钟内对我的计算应用相同的逻辑,就像我多年来的计算一样吗?

puts "#{1.year.from_now} | #{1.year.to_i.seconds.from_now}"
 2017-03-23 18:48:06 UTC | 2017-03-24 00:48:06 UTC
Run Code Online (Sandbox Code Playgroud)

我不明白6小时差异来自哪里.

Bor*_*aMa 10

差异是6个小时.这是因为1秒(以to_i方法转换)在Ruby on Rails核心扩展中被定义为365.25天:

>> 1.year.to_i / 60 / 60 / 24.0
=> 365.25
Run Code Online (Sandbox Code Playgroud)

那0.25天是实际的6小时差异.通过这样做,RoR试图计算闰年(基本近似)在4年内发生一次.从Rails源代码中years定义也可以看出这一点.

另一方面1.year.from_now,改变了具体的日历日期时间.就像你在挂历上翻页一样.

  • 真的有两个原因.1)没有一年有任何小数天.这可能是365天或366,具体取决于您所谈论的是哪一年.平均年份的长度仅在估算时有用,如果您正在估算,那么在几秒钟内得到结果的精度太细.2)365.25是*Julian*日历上年份的平均长度.我们大多数人使用*Gregorian*日历,平均年份为365.2425天. (2认同)