Bug #8485

Incorrect period index for Gregorian Dates at beginning of each CM_PERIOD

Added by teleological (Riley Lynch) almost 5 years ago. Updated almost 5 years ago.

Target version:
ruby -v:
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin12.3.0]


In Ruby 1.9-2.0 date_core, the year and chronological Julian day of a Date are stored as offsets from an indexed period relative to 0j, -4712-01-01 in the Julian calendar. Each period consists of exactly 194,796 Julian years, i.e. 194,800 Gregorian years.

Since 0j is -4713-11-24 in the proleptic Gregorian calendar, Gregorian calendar years do not align with these periods. A problem occurs when decode_years() uses the Gregorian calendar year of a Date in the the first 38 days of a period to assign the period index ("nth"). The calculation of nth ((y + 4712) / CM_PERIOD_GCY) is incorrect from November 24 until and including December 31. As a result of this error, an instance with period nth-1 is not equivalent to instances that represent the same Julian day, but which are constructed with an accurate period. These tests, which pass under Ruby 1.8, demonstrate the defect:

assert_equal(0, (Date.jd(0) <=> Date.civil(-4713, 11, 24, Date::GREGORIAN)))
assert_equal(0, (Date.jd(213447717) <=> Date.civil(579687, 11, 24)))
assert_equal(0, (Date.jd(-213447717) <=> Date.civil(-589113, 11, 24, Date::GREGORIAN)))

Attached is a patch against trunk which corrects this issue for methods which use decode_year() to assign the period index, including Date.civil, Date.ordinal and Date.commercial.

gregorian_periods.patch (3.46 KB) gregorian_periods.patch Patch for dd87e4631 (trunk) teleological (Riley Lynch), 06/04/2013 03:52 PM

Related issues

Related to Backport200 - Backport #8578: r41077, r41105Closed2013-06-29

Associated revisions

Revision e931e27a
Added by nagachika (Tomoyuki Chikanaga) almost 5 years ago

merge revision(s) 41077,41105: [Backport #8485] [Backport #8500] [Backport #8578]

* ext/date/date_core.c: fixed a bug .  reported
  by Riley Lynch.

* ext/date/date_core.c: fixed coding error .
  reported by Riley Lynch.

git-svn-id: svn+ssh:// b2dd03c8-39d4-4d8f-98ff-823fe69b080e


#1 [ruby-core:55307] Updated by tadf (tadayoshi funaba) almost 5 years ago

  • Assignee set to tadf (tadayoshi funaba)

different alignments are intentional.
nearly all parts don't require normalized nth and jd.
however, <=> is an exception.

#2 [ruby-core:55691] Updated by tadf (tadayoshi funaba) almost 5 years ago

  • Status changed from Open to Closed

Also available in: Atom PDF