以下表达式在Ruby中返回“ 366”,表示公元100是a年(不是leap年):

(Date.ordinal(101) - Date.ordinal(100)).to_i

与DateTime相同。

但是, Date.leap?(100)正确返回false

对于1.9.1版,结果相同。 和2.0.0。

是什么赋予了? 我应该提交错误报告吗?

更新资料

此外,大约1582年的时间短了10天!

(Date.ordinal(1583) - Date.ordinal(1582)).to_i
 => 355

===============>>#1 票数:8

根据维基百科, 100年确实是a年,而1582年确实跳过了10天。

===============>>#2 票数:4

显然,在1582-10-15之前,Ruby将日期解释为儒略历,而不是公历。 此处有更多详细信息:

http://teleologi.blogspot.com/2013/05/ruby-times-dates-good-bad-and-so-on.html

显然不是错误,但绝对违反了最少惊讶的原则(至少在此编码人员看来)。

真令人困惑!

编辑

除了关于“合理的默认设置”的辩论外,与其他语言相比,Ruby在日历选择的这些棘手问题上似乎也很灵活。 我了解到Date和DateTime构造函数可以接收一个“ reform date”常量,该常量确定何时发生从Julian到Gregorian日历的过渡。 默认值为意大利(1582-10-15),但也可以选择英国(跳转发生在1752-09-14)。

为了避免日历之间的过渡带来意外,我应该对所有日期都使用公历:

(Date.ordinal(i+1,1,Date::GREGORIAN) - Date.ordinal(i,1,Date::GREGORIAN)).to_i
 => 365

另外, Date.leap?(100)返回“ false”,因为它是Date.gregorian_leap?的别名Date.gregorian_leap? 同时, Date.julian_leap(100)返回true。 为避免意外,最好使用方法版本的jump ?,该方法将使用您选择的任何一个改革日期。

Date.new(100, 1, 1, Date::JULIAN).leap?
  => true

Date.new(100, 1, 1, Date::GREGORIAN).leap?
  => false

  ask by Kyle Simek translate from so

未解决问题?本站智能推荐: