class Date
Public Class Methods
gregorian_easter(y, sg=ITALY)
click to toggle source
# File lib/date/holiday.rb, line 268 def self.gregorian_easter(y, sg=ITALY) a = y % 19 b, c = y.divmod(100) d, e = b.divmod(4) f = ((b + 8) / 25).to_i g = ((b - f + 1) / 3).to_i h = (19 * a + b - d - g + 15) % 30 i, k = c.divmod(4) l = (32 + 2 * e + 2 * i - h - k) % 7 m = ((a + 11 * h + 22 * l) / 451).to_i n, p = (h + l - 7 * m + 114).divmod(31) Date.new(y, n, p + 1, GREGORIAN).new_start(sg) end
Also aliased as: easter
julian_easter(y, sg=ITALY)
click to toggle source
# File lib/date/holiday.rb, line 258 def self.julian_easter(y, sg=ITALY) a = y % 4 b = y % 7 c = y % 19 d = (19 * c + 15) % 30 e = (2 * a + 4 * b - d + 34) % 7 f, g = (d + e + 114).divmod(31) Date.new(y, f, g + 1, JULIAN).new_start(sg) end
Public Instance Methods
easter?()
click to toggle source
# File lib/date/holiday.rb, line 284 def easter? self === (if julian? self.class.julian_easter(year) else self.class.gregorian_easter(year) end) end
find_fdom(y, m, sg)
click to toggle source
# File lib/date/holiday.rb, line 50 def find_fdom(y, m, sg) 1.upto(31) do |d| if Date.valid_civil?(y, m, d, sg) return Date.new(y, m, d, sg).jd end end end
find_ldom(y, m, sg)
click to toggle source
# File lib/date/holiday.rb, line 58 def find_ldom(y, m, sg) 31.downto(1) do |d| if Date.valid_civil?(y, m, d, sg) return Date.new(y, m, d, sg).jd end end end
monday?()
click to toggle source
# File lib/date/holiday.rb, line 164 def monday? () wday == 1 end
national_holiday?()
click to toggle source
# File lib/date/holiday.rb, line 199 def national_holiday? d = if julian? then self.gregorian else self end d.instance_eval do nhol2? || nhol32? || nhol33? end end
nth_kday_to_jd(y, m, n, k, sg=GREGORIAN)
click to toggle source
# File lib/date/holiday.rb, line 66 def nth_kday_to_jd(y, m, n, k, sg=GREGORIAN) j = if n > 0 find_fdom(y, m, sg) - 1 else find_ldom(y, m, sg) + 7 end (j - (((j - k) + 1) % 7)) + 7 * n end
old_national_holiday?()
click to toggle source
# File lib/date/holiday.rb, line 250 def old_national_holiday? d = if julian? then self.gregorian else self end d.instance_eval do qfixed? || qnholx? || ((2407141..2432752) === jd && (qveq? || qaeq?)) # 1878-06-05/1948-07-19 end end
sunday?()
click to toggle source
# File lib/date/holiday.rb, line 163 def sunday? () wday == 0 end
Protected Instance Methods
need_subs?()
click to toggle source
# File lib/date/holiday.rb, line 169 def need_subs? nhol2? && (sunday? || (self - 1).need_subs?) end
nhol2?()
click to toggle source
# File lib/date/holiday.rb, line 160 def nhol2? () fixed? || float? || veq? || aeq? || extra? end
Private Instance Methods
_aeq(y)
click to toggle source
# File lib/date/holiday.rb, line 126 def _aeq(y) case y when 1851..1899; a = 22.2588; b = 1983.0 when 1900..1979; a = 23.2588; b = 1983.0 when 1980..2099; a = 23.2488; b = 1980.0 when 2100..2150; a = 24.2488; b = 1980.0 else; raise ArgumentError, 'domain error' end Date.new(y, 9, _deq(a, b, y)).jd end
_deq(a, b, y)
click to toggle source
# File lib/date/holiday.rb, line 111 def _deq(a, b, y) (a + 0.242194 * (y - 1980) - ((y - b) / 4).to_i).to_i end
_veq(y)
click to toggle source
# File lib/date/holiday.rb, line 115 def _veq(y) case y when 1851..1899; a = 19.8277; b = 1983.0 when 1900..1979; a = 20.8357; b = 1983.0 when 1980..2099; a = 20.8431; b = 1980.0 when 2100..2150; a = 21.8510; b = 1980.0 else; raise ArgumentError, 'domain error' end Date.new(y, 3, _deq(a, b, y)).jd end
aeq?()
click to toggle source
# File lib/date/holiday.rb, line 144 def aeq? return false unless (2432753..2506696) === jd # 1948-07-20/2150-12-31 jd == _aeq(year) end
extra?()
click to toggle source
# File lib/date/holiday.rb, line 149 def extra? jd == 2436669 || # 1959-04-10 # 16 jd == 2447582 || # 1989-02-24 jd == 2448208 || # 1990-11-12 jd == 2449148 || # 1993-06-09 jd == 2458605 || # 2019-05-01 jd == 2458779 # 2019-10-22 end
fixed?()
click to toggle source
# File lib/date/holiday.rb, line 8 def fixed? return false unless jd >= 2432753 # 1948-07-20/PooD *x = mon, mday xi = case year when 2020; 10 when 2021; 8 else; 11 end (x == [ 1, 1]) || # --01-01 (x == [ 1, 15] && # --01-15 (1948-07-20/1999-12-31) jd <= 2451544) || (x == [ 2, 11] && # --02-11 (1966-12-09/PooD) jd >= 2439469) || (x == [ 2, 23] && # --02-23 (2019-05-01/PooD) jd >= 2458605) || (x == [ 4, 29]) || # --04-29 (x == [ 5, 3]) || # --05-03 (x == [ 5, 4] && # --05-04 (2007-01-01/PooD) jd >= 2454102) || (x == [ 5, 5]) || # --05-05 (x == [ 7, 20] && # --07-20 (1996-01-01/2002-12-31) jd >= 2450084 && jd <= 2452640) || (x == [ 8, xi] && # --08-11 (2016-01-01/PooD) ex 2020-08-10 jd >= 2457389) || (x == [ 9, 15] && # --09-15 (1966-06-25/2002-12-31) jd >= 2439302 && jd <= 2452640) || (x == [10, 10] && # --10-10 (1966-06-25/1999-12-31) jd >= 2439302 && jd <= 2451544) || (x == [11, 3]) || # --11-03 (x == [11, 23]) || # --11-23 (x == [12, 23] && # --12-23 (1989-02-17/2019-04-30) jd >= 2447575 && jd <= 2458604) end
float?()
click to toggle source
# File lib/date/holiday.rb, line 86 def float? if year == 2020 return jd == 2458862 || # --01-13 jd == 2459054 || # --07-23 jd == 2459055 || # --07-24 jd == 2459114 # --09-21 end if year == 2021 return jd == 2459226 || # --01-11 jd == 2459418 || # --07-22 jd == 2459419 || # --07-23 jd == 2459478 # --09-20 end (mon == 1 && nth_kday?(2, 1) && # 2nd Mon, Jan (2000-01-01/PooD) jd >= 2451545) || (mon == 7 && nth_kday?(3, 1) && # 3nd Mon, Jul (2003-01-01/PooD) jd >= 2452641) || (mon == 9 && nth_kday?(3, 1) && # 3nd Mon, Sep (2003-01-01/PooD) jd >= 2452641) || (mon == 10 && nth_kday?(2, 1) && # 2nd Mon, Oct (2000-01-01/PooD) jd >= 2451545) end
nhol32?()
click to toggle source
# File lib/date/holiday.rb, line 175 def nhol32? if jd >= 2441785 if jd <= 2454101 # 1973-04-12/2006-12-31 self.monday? && (self - 1).nhol2? else # 2007-01-01/PooD !nhol2? && (self - 1).need_subs? end end end
nhol33?()
click to toggle source
# File lib/date/holiday.rb, line 185 def nhol33? if jd >= 2446427 if jd <= 2454101 # 1985-12-27/2006-12-31 !sunday? && !nhol32? && (self - 1).nhol2? && (self + 1).nhol2? else # 2007-01-01/PooD !nhol2? && (self - 1).nhol2? && (self + 1).nhol2? end end end
nth_kday?(n, k)
click to toggle source
# File lib/date/holiday.rb, line 80 def nth_kday? (n, k) k == wday && jd === nth_kday_to_jd(year, mon, n, k, start) end
qaeq?()
click to toggle source
# File lib/date/holiday.rb, line 232 def qaeq? return false unless (2405163..2432752) === jd # 1873-01-04/1948-07-19 jd == _aeq(year) end
qfixed?()
click to toggle source
# File lib/date/holiday.rb, line 204 def qfixed? return false unless (2405163..2432752) === jd # 1873-01-04/1948-07-19 *x = mon, mday (x == [ 1, 3] && (2405446..2432752) === jd) || # 1873-10-14/1948-07-19 (x == [ 1, 5] && (2405446..2432752) === jd) || # 1873-10-14/1948-07-19 (x == [ 1, 29] && (2405143..2405224) === jd) || # 1872-12-15/1873-03-06 (x == [ 1, 30] && (2405446..2419649) === jd) || # 1873-10-14/1912-09-03 (x == [ 2, 11] && (2405225..2432752) === jd) || # 1873-03-07/1948-07-19 (x == [ 4, 3] && (2405446..2432752) === jd) || # 1873-10-14/1948-07-19 (x == [ 4, 29] && (2424943..2432752) === jd) || # 1927-03-03/1948-07-19 (x == [ 7, 30] && (2419650..2424942) === jd) || # 1912-09-04/1927-03-02 (x == [ 8, 31] && (2419650..2424942) === jd) || # 1912-09-04/1927-03-02 (x == [ 9, 17] && (2405446..2407535) === jd) || # 1873-10-14/1879-07-04 (x == [10, 17] && (2407536..2432752) === jd) || # 1879-07-05/1948-07-19 (x == [10, 31] && (2419967..2424942) === jd) || # 1913-07-18/1927-03-02 (x == [11, 3] && (2405163..2419649) === jd) || # 1873-01-04/1912-09-03 (x == [11, 3] && (2424943..2432752) === jd) || # 1927-03-03/1948-07-19 (x == [11, 23] && (2405446..2432752) === jd) || # 1873-10-14/1948-07-19 (x == [12, 25] && (2424943..2432752) === jd) # 1927-03-03/1948-07-19 end
qnholx?()
click to toggle source
# File lib/date/holiday.rb, line 239 def qnholx? jd == 2420812 || # 1915-11-10 # 160 jd == 2420816 || # 1915-11-14 # 160 jd == 2420818 || # 1915-11-16 # 160 jd == 2425561 || # 1928-11-10 # 226 jd == 2425565 || # 1928-11-14 # 226 jd == 2425567 # 1928-11-16 # 226 end
qveq?()
click to toggle source
# File lib/date/holiday.rb, line 227 def qveq? return false unless (2405163..2432752) === jd # 1873-01-04/1948-07-19 jd == _veq(year) end
veq?()
click to toggle source
# File lib/date/holiday.rb, line 139 def veq? return false unless (2432753..2506696) === jd # 1948-07-20/2150-12-31 jd == _veq(year) end