lib/parsi-date.rb in parsi-date-0.4.0 vs lib/parsi-date.rb in parsi-date-0.5.0

- old
+ new

@@ -133,15 +133,15 @@ NANOSECONDS_IN_SECOND = Rational(1, 10**9) # :nodoc: JALALI_EPOCH_IN_AJD = Rational(3896641, 2) # :nodoc: MJD_EPOCH_IN_AJD = Rational(4800001, 2) # 1858-11-17 # :nodoc: UNIX_EPOCH_IN_AJD = Rational(4881175, 2) # 1970-01-01 # :nodoc: - JALALI_EPOCH_IN_CJD = 1948321 # :nodoc: + JALALI_EPOCH_IN_CJD = 1948320 # :nodoc: MJD_EPOCH_IN_CJD = 2400001 # :nodoc: UNIX_EPOCH_IN_CJD = 2440588 # :nodoc: LD_EPOCH_IN_CJD = 2299160 # :nodoc: - DAYS_IN_MONTH = [nil, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29] # :nodoc: + DAYS_IN_MONTH = [0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29] # :nodoc: LEAP_REMINDERS = [1, 5, 9, 13, 17, 22, 26, 30].freeze shared_methods = Module.new do @@ -151,42 +151,47 @@ end alias_method :jalali_leap?, :leap? private - DAYS_TO_FIRST_OF_MONTH = [nil, 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336] # :nodoc: - # Convert a Civil Date to a Julian Day Number and returns the corresponding Julian Day Number. - def civil_to_jd year, month, day # :nodoc: - epbase = year - 474 - epyear = 474 + (epbase % 2820) + def civil_to_jd(year, month, day) # :nodoc: + year -= 1 + month -= 1 + day -= 1 - day + DAYS_TO_FIRST_OF_MONTH[month] + - (epyear * 682 - 110) / 2816 + - (epyear - 1) * 365 + - (epbase / 2820 * 1029983) + - (JALALI_EPOCH_IN_CJD - 1) + jd = 365*year + (year/33)*8 + (year%33+3)/4; + while month > 0 + jd += DAYS_IN_MONTH[month] + month -= 1 + end + + jd + day + JALALI_EPOCH_IN_CJD end # Convert a Julian Day Number to a Civil Date. +jday+ is the Julian Day Number. # # Returns the corresponding [year, month, day_of_month] as a three-element array. - def jd_to_civil jday - depoch = (jday - first_day_of_year(475)) - cycle, cyear = depoch.divmod 1029983 + def jd_to_civil jd + jd -= JALALI_EPOCH_IN_CJD - if cyear == 1029982 - ycycle = 2820 - else - aux1, aux2 = cyear.divmod 366 - ycycle = (2134 * aux1 + 2816 * aux2 + 2815) / 1028522 + aux1 + 1 + n, jd = jd.divmod 12053 + m, jd = jd.divmod 1461 + year = 33*n + 4*m + 1 + + if jd >= 366 + n, jd = (jd - 1).divmod 365 + year += n end - year = ycycle + 2820 * cycle + 474 - yday = jday - first_day_of_year(year) + 1 - month = ((yday <= 186) ? yday / 31.0 : (yday - 6) / 30.0).ceil - day = (jday - first_day_of_month(year, month) + 1) - [year, month, day] + + month = 1 + while month < 12 && jd >= DAYS_IN_MONTH[month] + jd -= DAYS_IN_MONTH[month] + month += 1 + end + + [year, month, jd + 1] end # Do +year+, +month+, and day-of-month +day+ make a valid Civil Date? # Returns the corresponding Julian Day Number if they do, nil if they don't. # Invalid values cause an ArgumentError to be raised. @@ -330,11 +335,10 @@ # Parsi::Date.jd 2456229 # => #<Parsi::Date: 1391-08-07> # Parsi::Date.jd 2456230 # => #<Parsi::Date: 1391-08-08> # Parsi::Date.jd # => #<Parsi::Date: -5335-09-01> # def jd jday=0 - jd = _valid_jd? jday new! jd_to_ajd(jday, 0, 0), 0 end # Create a new Date object from an Ordinal Date, specified by +year+ and day-of-year +yday+. # +yday+ can be negative, in which it counts backwards from the end of the year. @@ -731,10 +735,10 @@ # Dump to Marshal format. def marshal_dump() [@ajd, @offset] end # Load from Marshal format. - def marshal_load(a) @ajd, @of, = a end + def marshal_load(a) @ajd, @offset, = a end end end class Date class << self