diff --git a/holidays/calendars/tibetan.py b/holidays/calendars/tibetan.py index 132fbc1e79..6f3835a522 100644 --- a/holidays/calendars/tibetan.py +++ b/holidays/calendars/tibetan.py @@ -13,7 +13,20 @@ from datetime import date from holidays.calendars.custom import _CustomCalendar -from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV +from holidays.calendars.gregorian import ( + JAN, + FEB, + MAR, + APR, + MAY, + JUN, + JUL, + AUG, + SEP, + OCT, + NOV, + DEC, +) BIRTH_OF_GURU_RINPOCHE = "BIRTH_OF_GURU_RINPOCHE" BLESSED_RAINY_DAY = "BLESSED_RAINY_DAY" @@ -36,6 +49,70 @@ class _TibetanLunisolar: """ BIRTH_OF_GURU_RINPOCHE_DATES = { + 1900: (JUL, 7), + 1901: (JUN, 26), + 1902: (JUN, 15), + 1903: (JUL, 4), + 1905: (JUN, 12), + 1906: (JUL, 1), + 1907: (JUN, 21), + 1908: (JUL, 9), + 1909: (JUN, 28), + 1910: (JUN, 17), + 1911: (JUL, 6), + 1912: (JUN, 24), + 1915: (JUN, 22), + 1916: (JUL, 10), + 1917: (JUN, 30), + 1918: (JUN, 19), + 1919: (JUL, 7), + 1920: (JUN, 26), + 1921: (JUN, 15), + 1922: (JUL, 4), + 1923: (JUN, 24), + 1924: (JUN, 12), + 1925: (JUL, 1), + 1926: (JUN, 20), + 1927: (JUL, 9), + 1928: (JUN, 27), + 1929: (JUN, 16), + 1930: (JUL, 5), + 1931: (JUN, 25), + 1932: (JUN, 14), + 1933: (JUL, 3), + 1934: (JUN, 22), + 1935: (JUL, 11), + 1936: (JUN, 29), + 1937: (JUN, 18), + 1938: (JUL, 7), + 1939: (JUN, 26), + 1940: (JUN, 15), + 1941: (JUL, 4), + 1942: (JUN, 24), + 1943: (JUL, 12), + 1944: (JUL, 1), + 1945: (JUN, 20), + 1946: (JUL, 9), + 1947: (JUN, 28), + 1948: (JUN, 16), + 1949: (JUL, 5), + 1950: (JUN, 25), + 1952: (JUL, 2), + 1953: (JUN, 22), + 1954: (JUL, 10), + 1955: (JUN, 29), + 1956: (JUN, 18), + 1958: (JUN, 26), + 1959: (JUN, 16), + 1960: (JUL, 4), + 1961: (JUN, 23), + 1962: (JUL, 12), + 1963: (JUL, 1), + 1964: (JUN, 19), + 1965: (JUL, 8), + 1967: (JUN, 17), + 1968: (JUL, 5), + 1969: (JUN, 25), 1970: (JUN, 14), 1971: (JUL, 3), 1972: (JUN, 21), @@ -52,7 +129,7 @@ class _TibetanLunisolar: 1986: (JUN, 17), 1987: (JUL, 6), 1988: (JUN, 24), - 1989: (JUN, 13), + 1989: (JUN, 14), 1990: (JUL, 2), 1991: (JUN, 21), 1992: (JUL, 9), @@ -75,7 +152,7 @@ class _TibetanLunisolar: 2012: (JUN, 29), 2013: (JUN, 18), 2014: (JUL, 7), - 2015: (JUN, 26), + 2015: (JUN, 27), 2016: (JUN, 15), 2017: (JUL, 3), 2018: (JUN, 23), @@ -87,6 +164,7 @@ class _TibetanLunisolar: 2024: (JUN, 16), 2025: (JUL, 5), 2026: (JUN, 24), + 2027: (JUL, 13), 2028: (JUL, 1), 2029: (JUN, 21), 2030: (JUL, 10), @@ -131,11 +209,11 @@ class _TibetanLunisolar: 2070: (JUN, 18), 2071: (JUL, 7), 2072: (JUN, 25), - 2073: (JUN, 15), + 2073: (JUL, 14), 2074: (JUL, 4), 2075: (JUN, 23), 2076: (JUL, 11), - 2077: (JUN, 30), + 2077: (JUL, 1), 2078: (JUN, 20), 2079: (JUL, 8), 2081: (JUN, 16), @@ -149,7 +227,7 @@ class _TibetanLunisolar: 2089: (JUN, 17), 2090: (JUL, 6), 2091: (JUN, 26), - 2092: (JUN, 15), + 2092: (JUL, 14), 2093: (JUL, 4), 2094: (JUN, 23), 2095: (JUL, 12), @@ -157,9 +235,80 @@ class _TibetanLunisolar: 2097: (JUN, 19), 2098: (JUL, 8), 2099: (JUN, 27), + 2100: (JUN, 17), } BLESSED_RAINY_DAY_DATES = { + 1900: (SEP, 23), + 1901: (SEP, 23), + 1902: (SEP, 23), + 1903: (SEP, 23), + 1904: (SEP, 23), + 1905: (SEP, 23), + 1906: (SEP, 23), + 1907: (SEP, 23), + 1908: (SEP, 23), + 1909: (SEP, 23), + 1910: (SEP, 23), + 1911: (SEP, 23), + 1912: (SEP, 23), + 1913: (SEP, 23), + 1914: (SEP, 23), + 1915: (SEP, 23), + 1916: (SEP, 23), + 1917: (SEP, 23), + 1918: (SEP, 23), + 1919: (SEP, 23), + 1920: (SEP, 23), + 1921: (SEP, 23), + 1922: (SEP, 23), + 1923: (SEP, 23), + 1924: (SEP, 23), + 1925: (SEP, 23), + 1926: (SEP, 23), + 1927: (SEP, 23), + 1928: (SEP, 23), + 1929: (SEP, 23), + 1930: (SEP, 23), + 1931: (SEP, 23), + 1932: (SEP, 23), + 1933: (SEP, 23), + 1934: (SEP, 23), + 1935: (SEP, 23), + 1936: (SEP, 23), + 1937: (SEP, 23), + 1938: (SEP, 23), + 1939: (SEP, 23), + 1940: (SEP, 23), + 1941: (SEP, 23), + 1942: (SEP, 23), + 1943: (SEP, 23), + 1944: (SEP, 23), + 1945: (SEP, 23), + 1946: (SEP, 23), + 1947: (SEP, 23), + 1948: (SEP, 23), + 1949: (SEP, 23), + 1950: (SEP, 23), + 1951: (SEP, 23), + 1952: (SEP, 23), + 1953: (SEP, 23), + 1954: (SEP, 23), + 1955: (SEP, 23), + 1956: (SEP, 23), + 1957: (SEP, 23), + 1958: (SEP, 23), + 1959: (SEP, 23), + 1960: (SEP, 23), + 1961: (SEP, 23), + 1962: (SEP, 23), + 1963: (SEP, 23), + 1964: (SEP, 23), + 1965: (SEP, 23), + 1966: (SEP, 23), + 1967: (SEP, 23), + 1968: (SEP, 23), + 1969: (SEP, 23), 1970: (SEP, 23), 1971: (SEP, 23), 1972: (SEP, 23), @@ -190,63 +339,181 @@ class _TibetanLunisolar: 1997: (SEP, 23), 1998: (SEP, 23), 1999: (SEP, 23), - 2000: (SEP, 22), + 2000: (SEP, 23), 2001: (SEP, 23), 2002: (SEP, 23), 2003: (SEP, 23), - 2004: (SEP, 22), + 2004: (SEP, 23), 2005: (SEP, 23), 2006: (SEP, 23), 2007: (SEP, 23), - 2008: (SEP, 22), + 2008: (SEP, 23), 2009: (SEP, 23), 2010: (SEP, 23), 2011: (SEP, 23), - 2012: (SEP, 22), + 2012: (SEP, 23), 2013: (SEP, 23), 2014: (SEP, 23), - 2015: (SEP, 22), + 2015: (SEP, 23), 2016: (SEP, 23), 2017: (SEP, 23), 2018: (SEP, 23), - 2019: (SEP, 24), + 2019: (SEP, 23), 2020: (SEP, 23), 2021: (SEP, 23), 2022: (SEP, 23), - 2023: (SEP, 24), + 2023: (SEP, 23), 2024: (SEP, 23), 2025: (SEP, 23), 2026: (SEP, 23), 2027: (SEP, 23), - 2028: (SEP, 22), - 2029: (SEP, 22), + 2028: (SEP, 23), + 2029: (SEP, 23), 2030: (SEP, 23), 2031: (SEP, 23), - 2032: (SEP, 22), - 2033: (SEP, 22), + 2032: (SEP, 23), + 2033: (SEP, 23), 2034: (SEP, 23), 2035: (SEP, 23), - 2036: (SEP, 22), - 2037: (SEP, 22), + 2036: (SEP, 23), + 2037: (SEP, 23), 2038: (SEP, 23), 2039: (SEP, 23), - 2040: (SEP, 22), - 2041: (SEP, 22), + 2040: (SEP, 23), + 2041: (SEP, 23), 2042: (SEP, 23), 2043: (SEP, 23), - 2044: (SEP, 22), - 2045: (SEP, 22), + 2044: (SEP, 23), + 2045: (SEP, 23), 2046: (SEP, 23), 2047: (SEP, 23), - 2048: (SEP, 22), - 2049: (SEP, 22), + 2048: (SEP, 23), + 2049: (SEP, 23), 2050: (SEP, 23), 2051: (SEP, 23), - 2052: (SEP, 22), + 2052: (SEP, 23), + 2053: (SEP, 23), + 2054: (SEP, 23), + 2055: (SEP, 23), + 2056: (SEP, 23), + 2057: (SEP, 23), + 2058: (SEP, 23), + 2059: (SEP, 23), + 2060: (SEP, 23), + 2061: (SEP, 23), + 2062: (SEP, 23), + 2063: (SEP, 23), + 2064: (SEP, 23), + 2065: (SEP, 23), + 2066: (SEP, 23), + 2067: (SEP, 23), + 2068: (SEP, 23), + 2069: (SEP, 23), + 2070: (SEP, 23), + 2071: (SEP, 23), + 2072: (SEP, 23), + 2073: (SEP, 23), + 2074: (SEP, 23), + 2075: (SEP, 23), + 2076: (SEP, 23), + 2077: (SEP, 23), + 2078: (SEP, 23), + 2079: (SEP, 23), + 2080: (SEP, 23), + 2081: (SEP, 23), + 2082: (SEP, 23), + 2083: (SEP, 23), + 2084: (SEP, 23), + 2085: (SEP, 23), + 2086: (SEP, 23), + 2087: (SEP, 23), + 2088: (SEP, 23), + 2089: (SEP, 23), + 2090: (SEP, 23), + 2091: (SEP, 23), + 2092: (SEP, 23), + 2093: (SEP, 23), + 2094: (SEP, 23), + 2095: (SEP, 23), + 2096: (SEP, 23), + 2097: (SEP, 23), + 2098: (SEP, 23), + 2099: (SEP, 23), + 2100: (SEP, 23), } BUDDHA_FIRST_SERMON_DATES = { - 1970: (JUL, 7), + 1900: (JUL, 30), + 1901: (JUL, 19), + 1902: (JUL, 9), + 1903: (JUL, 28), + 1904: (JUL, 16), + 1905: (AUG, 4), + 1906: (JUL, 25), + 1907: (JUL, 14), + 1908: (AUG, 1), + 1909: (JUL, 21), + 1910: (JUL, 10), + 1911: (JUL, 29), + 1912: (JUL, 18), + 1913: (JUL, 7), + 1914: (JUL, 26), + 1915: (JUL, 16), + 1916: (AUG, 3), + 1917: (JUL, 23), + 1918: (JUL, 12), + 1919: (JUL, 31), + 1920: (JUL, 19), + 1921: (JUL, 9), + 1922: (JUL, 28), + 1923: (JUL, 17), + 1924: (AUG, 4), + 1925: (JUL, 25), + 1926: (JUL, 14), + 1927: (AUG, 1), + 1928: (JUL, 21), + 1929: (JUL, 10), + 1930: (JUL, 29), + 1931: (JUL, 19), + 1932: (JUL, 7), + 1933: (JUL, 26), + 1934: (JUL, 15), + 1935: (AUG, 3), + 1936: (JUL, 22), + 1937: (JUL, 11), + 1938: (JUL, 30), + 1939: (JUL, 20), + 1940: (JUL, 9), + 1941: (JUL, 28), + 1942: (JUL, 17), + 1943: (AUG, 5), + 1944: (JUL, 24), + 1945: (JUL, 13), + 1946: (AUG, 1), + 1947: (JUL, 21), + 1948: (JUL, 10), + 1949: (JUL, 29), + 1950: (JUL, 19), + 1951: (JUL, 8), + 1952: (JUL, 26), + 1953: (JUL, 15), + 1954: (AUG, 2), + 1955: (JUL, 23), + 1956: (JUL, 11), + 1957: (JUL, 30), + 1958: (JUL, 20), + 1959: (JUL, 10), + 1960: (JUL, 27), + 1961: (JUL, 17), + 1962: (AUG, 4), + 1963: (JUL, 24), + 1964: (JUL, 13), + 1965: (AUG, 1), + 1966: (JUL, 21), + 1967: (JUL, 11), + 1968: (JUL, 29), + 1969: (JUL, 18), + 1970: (AUG, 6), 1971: (JUL, 26), 1972: (JUL, 14), 1973: (AUG, 2), @@ -265,7 +532,7 @@ class _TibetanLunisolar: 1986: (JUL, 11), 1987: (JUL, 30), 1988: (JUL, 18), - 1989: (JUL, 7), + 1989: (AUG, 5), 1990: (JUL, 25), 1991: (JUL, 15), 1992: (AUG, 2), @@ -299,7 +566,7 @@ class _TibetanLunisolar: 2020: (JUL, 24), 2021: (JUL, 14), 2022: (AUG, 1), - 2023: (JUL, 21), + 2023: (JUL, 22), 2024: (JUL, 10), 2025: (JUL, 28), 2026: (JUL, 18), @@ -311,7 +578,7 @@ class _TibetanLunisolar: 2032: (JUL, 11), 2033: (JUL, 30), 2034: (JUL, 19), - 2035: (JUL, 9), + 2035: (AUG, 7), 2036: (JUL, 27), 2037: (JUL, 16), 2038: (AUG, 4), @@ -325,12 +592,12 @@ class _TibetanLunisolar: 2046: (AUG, 6), 2047: (JUL, 26), 2048: (JUL, 15), - 2049: (AUG, 2), + 2049: (AUG, 3), 2050: (JUL, 23), 2051: (JUL, 12), 2052: (JUL, 29), 2053: (JUL, 19), - 2054: (JUL, 9), + 2054: (AUG, 7), 2055: (JUL, 28), 2056: (JUL, 16), 2057: (AUG, 4), @@ -361,7 +628,7 @@ class _TibetanLunisolar: 2082: (JUL, 29), 2084: (AUG, 5), 2085: (JUL, 25), - 2086: (JUL, 14), + 2086: (JUL, 15), 2087: (AUG, 2), 2088: (JUL, 22), 2089: (JUL, 11), @@ -374,9 +641,76 @@ class _TibetanLunisolar: 2096: (JUL, 23), 2097: (JUL, 13), 2099: (JUL, 21), + 2100: (AUG, 9), } BUDDHA_PARINIRVANA_DATES = { + 1900: (JUN, 13), + 1901: (JUN, 2), + 1902: (MAY, 22), + 1903: (JUN, 10), + 1904: (MAY, 29), + 1905: (MAY, 18), + 1907: (MAY, 27), + 1908: (JUN, 14), + 1909: (JUN, 4), + 1910: (MAY, 24), + 1911: (JUN, 11), + 1912: (MAY, 30), + 1913: (MAY, 20), + 1914: (JUN, 8), + 1916: (MAY, 17), + 1917: (JUN, 5), + 1918: (MAY, 25), + 1919: (JUN, 13), + 1920: (JUN, 1), + 1921: (MAY, 21), + 1922: (JUN, 9), + 1923: (MAY, 30), + 1926: (MAY, 27), + 1927: (JUN, 15), + 1928: (JUN, 3), + 1929: (MAY, 23), + 1930: (JUN, 11), + 1931: (MAY, 31), + 1932: (MAY, 20), + 1933: (JUN, 8), + 1934: (MAY, 28), + 1935: (JUN, 16), + 1936: (JUN, 5), + 1937: (MAY, 25), + 1938: (JUN, 12), + 1939: (JUN, 2), + 1940: (MAY, 21), + 1941: (JUN, 9), + 1942: (MAY, 30), + 1943: (MAY, 19), + 1944: (JUN, 6), + 1945: (MAY, 27), + 1946: (JUN, 14), + 1947: (JUN, 3), + 1948: (MAY, 23), + 1949: (JUN, 10), + 1950: (MAY, 31), + 1951: (MAY, 21), + 1952: (JUN, 8), + 1953: (MAY, 28), + 1954: (JUN, 16), + 1955: (JUN, 5), + 1956: (MAY, 24), + 1957: (JUN, 12), + 1958: (JUN, 1), + 1959: (MAY, 22), + 1960: (JUN, 9), + 1961: (MAY, 30), + 1962: (MAY, 19), + 1963: (JUN, 7), + 1964: (MAY, 26), + 1965: (JUN, 14), + 1966: (JUN, 3), + 1967: (MAY, 23), + 1968: (JUN, 10), + 1969: (MAY, 31), 1970: (MAY, 21), 1971: (JUN, 8), 1972: (MAY, 28), @@ -388,7 +722,7 @@ class _TibetanLunisolar: 1978: (MAY, 22), 1979: (JUN, 10), 1980: (MAY, 29), - 1981: (MAY, 18), + 1981: (JUN, 17), 1982: (JUN, 6), 1983: (MAY, 26), 1984: (JUN, 13), @@ -407,7 +741,7 @@ class _TibetanLunisolar: 1997: (MAY, 22), 1998: (JUN, 10), 1999: (MAY, 30), - 2000: (MAY, 18), + 2000: (JUN, 16), 2001: (JUN, 6), 2002: (MAY, 26), 2003: (JUN, 14), @@ -415,7 +749,7 @@ class _TibetanLunisolar: 2005: (MAY, 23), 2006: (JUN, 11), 2007: (MAY, 31), - 2008: (MAY, 19), + 2008: (MAY, 20), 2009: (JUN, 7), 2010: (MAY, 27), 2011: (JUN, 15), @@ -453,7 +787,7 @@ class _TibetanLunisolar: 2043: (MAY, 23), 2044: (JUN, 10), 2045: (MAY, 30), - 2046: (MAY, 20), + 2046: (JUN, 18), 2047: (JUN, 8), 2048: (MAY, 27), 2049: (JUN, 15), @@ -472,12 +806,12 @@ class _TibetanLunisolar: 2062: (MAY, 23), 2063: (JUN, 11), 2064: (MAY, 30), - 2065: (MAY, 20), + 2065: (JUN, 18), 2066: (JUN, 8), 2067: (MAY, 28), 2068: (JUN, 15), 2069: (JUN, 4), - 2070: (MAY, 24), + 2070: (MAY, 25), 2071: (JUN, 12), 2072: (MAY, 31), 2073: (MAY, 21), @@ -503,141 +837,281 @@ class _TibetanLunisolar: 2093: (JUN, 9), 2094: (MAY, 30), 2095: (JUN, 17), - 2096: (JUN, 5), + 2096: (JUN, 6), 2097: (MAY, 26), 2098: (JUN, 13), 2099: (JUN, 3), + 2100: (MAY, 23), } DAY_OF_OFFERING_DATES = { - 1971: (JAN, 27), - 1972: (JAN, 17), - 1973: (JAN, 5), - 1974: (JAN, 24), - 1975: (JAN, 13), - 1976: (FEB, 1), - 1977: (JAN, 20), - 1979: (JAN, 29), - 1980: (JAN, 18), - 1981: (JAN, 7), - 1982: (JAN, 26), - 1983: (JAN, 15), - 1984: (JAN, 4), - 1985: (JAN, 21), - 1986: (JAN, 11), - 1987: (JAN, 30), - 1988: (JAN, 20), - 1989: (JAN, 8), - 1990: (JAN, 27), - 1991: (JAN, 16), - 1992: (JAN, 5), - 1993: (JAN, 23), - 1994: (JAN, 12), - 1995: (JAN, 31), - 1996: (JAN, 21), - 1997: (JAN, 10), - 1998: (JAN, 29), - 1999: (JAN, 18), - 2000: (JAN, 7), - 2001: (JAN, 25), - 2002: (JAN, 14), - 2003: (JAN, 3), - 2004: (JAN, 22), - 2005: (JAN, 11), - 2006: (JAN, 30), - 2007: (JAN, 20), - 2008: (JAN, 9), - 2009: (JAN, 27), - 2010: (JAN, 16), - 2011: (JAN, 5), - 2012: (JAN, 24), - 2013: (JAN, 12), - 2014: (JAN, 31), - 2015: (JAN, 21), - 2016: (JAN, 10), - 2017: (JAN, 28), - 2018: (JAN, 17), - 2019: (JAN, 6), - 2020: (JAN, 25), - 2021: (JAN, 14), - 2022: (JAN, 3), - 2023: (JAN, 22), - 2024: (JAN, 12), - 2025: (JAN, 30), - 2026: (JAN, 19), - 2027: (JAN, 8), - 2028: (JAN, 27), - 2029: (JAN, 15), - 2030: (JAN, 4), - 2032: (JAN, 13), - 2033: (JAN, 31), - 2034: (JAN, 21), - 2035: (JAN, 10), - 2036: (JAN, 29), - 2037: (JAN, 17), - 2038: (JAN, 6), - 2039: (JAN, 25), - 2041: (FEB, 2), - 2042: (JAN, 22), - 2043: (JAN, 12), - 2044: (JAN, 31), - 2045: (JAN, 19), - 2046: (JAN, 8), - 2047: (JAN, 26), - 2048: (JAN, 16), - 2049: (JAN, 4), - 2050: (JAN, 24), - 2051: (JAN, 13), - 2052: (FEB, 1), - 2053: (JAN, 20), - 2054: (JAN, 9), - 2055: (JAN, 28), - 2056: (JAN, 17), - 2057: (JAN, 6), - 2058: (JAN, 25), - 2060: (FEB, 3), - 2061: (JAN, 22), - 2062: (JAN, 11), - 2063: (JAN, 30), - 2064: (JAN, 19), - 2065: (JAN, 7), - 2066: (JAN, 26), - 2067: (JAN, 16), - 2070: (JAN, 13), - 2071: (FEB, 1), - 2072: (JAN, 21), - 2073: (JAN, 9), - 2074: (JAN, 28), - 2075: (JAN, 17), - 2076: (JAN, 7), - 2077: (JAN, 25), - 2078: (JAN, 14), - 2079: (FEB, 2), - 2080: (JAN, 22), - 2081: (JAN, 10), - 2082: (JAN, 29), - 2084: (JAN, 8), - 2085: (JAN, 26), - 2086: (JAN, 16), - 2087: (JAN, 5), - 2088: (JAN, 24), - 2089: (JAN, 12), - 2090: (JAN, 31), - 2091: (JAN, 20), - 2092: (JAN, 9), - 2094: (JAN, 17), - 2095: (JAN, 7), - 2096: (JAN, 26), - 2097: (JAN, 14), - 2098: (FEB, 2), - 2099: (JAN, 22), + 1901: (JAN, 20), + 1902: (JAN, 9), + 1903: (JAN, 28), + 1904: (JAN, 17), + 1905: (JAN, 5), + 1906: (JAN, 24), + 1907: (JAN, 14), + 1908: (JAN, 3), + 1909: (JAN, 21), + 1910: (DEC, 31), + 1911: (JAN, 30), + 1912: (JAN, 19), + 1913: (JAN, 7), + 1914: (JAN, 26), + 1915: (JAN, 15), + 1916: (JAN, 5), + 1917: (JAN, 23), + 1918: (JAN, 12), + 1919: (JAN, 2), + 1920: (JAN, 21), + 1921: (JAN, 9), + 1922: (JAN, 27), + 1923: (JAN, 16), + 1924: (JAN, 6), + 1925: (JAN, 24), + 1926: (JAN, 14), + 1927: (JAN, 3), + 1928: (JAN, 22), + 1929: (DEC, 30), + 1930: (JAN, 29), + 1931: (JAN, 18), + 1932: (JAN, 7), + 1933: (JAN, 25), + 1934: (JAN, 15), + 1935: (JAN, 5), + 1936: (JAN, 24), + 1937: (JAN, 12), + 1938: (JAN, 1), + 1939: (JAN, 20), + 1940: (JAN, 9), + 1941: (JAN, 27), + 1942: (JAN, 16), + 1943: (JAN, 6), + 1944: (JAN, 25), + 1945: (JAN, 14), + 1946: (JAN, 3), + 1947: (JAN, 22), + 1948: (JAN, 11), + 1949: (JAN, 28), + 1950: (JAN, 18), + 1951: (JAN, 7), + 1952: (JAN, 26), + 1953: (JAN, 15), + 1954: (JAN, 4), + 1955: (JAN, 23), + 1956: (DEC, 31), + 1958: (JAN, 19), + 1959: (JAN, 9), + 1960: (JAN, 28), + 1961: (JAN, 16), + 1962: (JAN, 6), + 1963: (JAN, 25), + 1964: (JAN, 14), + 1965: (JAN, 2), + 1966: (JAN, 21), + 1967: (JAN, 10), + 1968: (JAN, 29), + 1969: (JAN, 18), + 1970: (JAN, 7), + 1971: (JAN, 26), + 1972: (JAN, 16), + 1973: (JAN, 4), + 1974: (JAN, 23), + 1975: (JAN, 12), + 1976: (JAN, 31), + 1977: (JAN, 19), + 1978: (JAN, 9), + 1979: (JAN, 28), + 1980: (JAN, 17), + 1981: (JAN, 6), + 1982: (JAN, 25), + 1983: (JAN, 14), + 1984: (JAN, 3), + 1985: (JAN, 20), + 1986: (JAN, 10), + 1987: (JAN, 29), + 1988: (JAN, 19), + 1989: (JAN, 7), + 1990: (JAN, 26), + 1991: (JAN, 15), + 1992: (JAN, 4), + 1993: (JAN, 22), + 1994: (JAN, 11), + 1995: (JAN, 30), + 1996: (JAN, 20), + 1997: (JAN, 9), + 1998: (JAN, 28), + 1999: (JAN, 17), + 2000: (JAN, 6), + 2001: (JAN, 24), + 2002: (JAN, 13), + 2003: (JAN, 2), + 2004: (JAN, 21), + 2005: (JAN, 10), + 2006: (JAN, 29), + 2007: (JAN, 19), + 2008: (JAN, 8), + 2009: (JAN, 26), + 2010: (JAN, 15), + 2011: (JAN, 4), + 2012: (JAN, 23), + 2013: (JAN, 11), + 2014: (JAN, 30), + 2015: (JAN, 20), + 2016: (JAN, 9), + 2017: (JAN, 27), + 2018: (JAN, 16), + 2019: (JAN, 5), + 2020: (JAN, 24), + 2021: (JAN, 13), + 2022: (JAN, 2), + 2023: (JAN, 21), + 2024: (JAN, 11), + 2025: (JAN, 29), + 2026: (JAN, 18), + 2027: (JAN, 7), + 2028: (JAN, 26), + 2029: (JAN, 14), + 2031: (JAN, 23), + 2032: (JAN, 12), + 2033: (JAN, 30), + 2034: (JAN, 20), + 2035: (JAN, 9), + 2036: (JAN, 28), + 2037: (JAN, 16), + 2038: (JAN, 5), + 2039: (JAN, 24), + 2040: (JAN, 14), + 2041: (FEB, 1), + 2042: (JAN, 21), + 2043: (JAN, 11), + 2044: (JAN, 30), + 2045: (JAN, 18), + 2046: (JAN, 7), + 2047: (JAN, 25), + 2048: (JAN, 15), + 2050: (JAN, 23), + 2051: (JAN, 12), + 2052: (JAN, 31), + 2053: (JAN, 19), + 2054: (JAN, 8), + 2055: (JAN, 27), + 2056: (JAN, 16), + 2057: (JAN, 5), + 2058: (JAN, 24), + 2059: (JAN, 14), + 2060: (FEB, 2), + 2061: (JAN, 21), + 2062: (JAN, 10), + 2063: (JAN, 29), + 2064: (JAN, 18), + 2065: (JAN, 6), + 2066: (JAN, 25), + 2067: (JAN, 15), + 2068: (JAN, 5), + 2069: (JAN, 23), + 2070: (JAN, 12), + 2071: (JAN, 31), + 2072: (JAN, 20), + 2073: (JAN, 8), + 2074: (JAN, 27), + 2075: (JAN, 16), + 2076: (JAN, 6), + 2077: (JAN, 24), + 2078: (JAN, 13), + 2079: (FEB, 1), + 2080: (JAN, 21), + 2081: (JAN, 9), + 2082: (JAN, 28), + 2083: (JAN, 18), + 2084: (JAN, 7), + 2085: (JAN, 25), + 2086: (JAN, 15), + 2087: (JAN, 4), + 2088: (JAN, 23), + 2089: (JAN, 11), + 2090: (JAN, 30), + 2091: (JAN, 19), + 2093: (JAN, 27), + 2094: (JAN, 16), + 2095: (JAN, 6), + 2096: (JAN, 25), + 2097: (JAN, 13), + 2098: (FEB, 1), + 2099: (JAN, 21), + 2100: (JAN, 10), + 2101: (JAN, 29), } DEATH_OF_ZHABDRUNG_DATES = { + 1900: (MAY, 9), + 1901: (APR, 28), + 1902: (APR, 17), + 1903: (MAY, 6), + 1904: (APR, 25), + 1905: (APR, 15), + 1907: (APR, 23), + 1908: (MAY, 11), + 1909: (APR, 30), + 1910: (APR, 19), + 1911: (MAY, 8), + 1912: (APR, 26), + 1913: (APR, 16), + 1914: (MAY, 5), + 1915: (APR, 24), + 1916: (APR, 13), + 1917: (MAY, 1), + 1918: (APR, 20), + 1919: (MAY, 9), + 1920: (APR, 28), + 1921: (APR, 17), + 1922: (MAY, 6), + 1923: (APR, 26), + 1924: (APR, 14), + 1925: (MAY, 3), + 1926: (APR, 22), + 1927: (MAY, 11), + 1928: (APR, 29), + 1931: (APR, 27), + 1932: (APR, 16), + 1933: (MAY, 5), + 1934: (APR, 24), + 1935: (APR, 13), + 1936: (MAY, 1), + 1937: (APR, 20), + 1938: (MAY, 9), + 1940: (APR, 17), + 1941: (MAY, 6), + 1942: (APR, 26), + 1943: (APR, 15), + 1944: (MAY, 2), + 1945: (APR, 22), + 1946: (MAY, 10), + 1947: (APR, 30), + 1949: (MAY, 8), + 1950: (APR, 27), + 1951: (APR, 16), + 1952: (MAY, 4), + 1953: (APR, 23), + 1954: (MAY, 12), + 1955: (MAY, 1), + 1956: (APR, 20), + 1957: (MAY, 9), + 1959: (APR, 18), + 1960: (MAY, 6), + 1961: (APR, 25), + 1962: (APR, 14), + 1963: (MAY, 3), + 1964: (APR, 21), + 1965: (MAY, 10), + 1966: (APR, 30), + 1968: (MAY, 7), + 1969: (APR, 27), 1970: (APR, 16), 1971: (MAY, 5), 1972: (APR, 23), - 1973: (APR, 12), + 1973: (MAY, 12), 1974: (MAY, 1), 1975: (APR, 21), 1976: (MAY, 9), @@ -678,7 +1152,7 @@ class _TibetanLunisolar: 2016: (APR, 16), 2017: (MAY, 5), 2018: (APR, 25), - 2019: (APR, 14), + 2019: (MAY, 14), 2021: (APR, 22), 2022: (MAY, 11), 2023: (APR, 30), @@ -691,14 +1165,14 @@ class _TibetanLunisolar: 2030: (MAY, 12), 2031: (MAY, 2), 2032: (APR, 20), - 2033: (MAY, 8), + 2033: (MAY, 9), 2034: (APR, 28), 2035: (APR, 17), 2036: (MAY, 5), 2037: (APR, 25), - 2038: (APR, 14), + 2038: (MAY, 14), 2039: (MAY, 3), - 2040: (APR, 21), + 2040: (APR, 22), 2041: (MAY, 10), 2042: (APR, 29), 2043: (APR, 19), @@ -742,7 +1216,7 @@ class _TibetanLunisolar: 2081: (APR, 18), 2082: (MAY, 7), 2083: (APR, 27), - 2084: (APR, 15), + 2084: (MAY, 15), 2085: (MAY, 4), 2086: (APR, 23), 2087: (MAY, 12), @@ -758,9 +1232,76 @@ class _TibetanLunisolar: 2097: (APR, 21), 2098: (MAY, 10), 2099: (APR, 30), + 2100: (APR, 19), } DESCENDING_DAY_OF_LORD_BUDDHA_DATES = { + 1900: (NOV, 13), + 1902: (OCT, 23), + 1903: (NOV, 11), + 1904: (OCT, 31), + 1905: (NOV, 19), + 1906: (NOV, 8), + 1907: (OCT, 28), + 1908: (NOV, 15), + 1909: (NOV, 4), + 1910: (OCT, 24), + 1912: (NOV, 1), + 1913: (NOV, 20), + 1914: (NOV, 10), + 1915: (OCT, 30), + 1916: (NOV, 17), + 1917: (NOV, 6), + 1918: (OCT, 26), + 1919: (NOV, 14), + 1920: (NOV, 2), + 1921: (OCT, 23), + 1922: (NOV, 11), + 1923: (NOV, 1), + 1924: (NOV, 18), + 1925: (NOV, 7), + 1926: (OCT, 27), + 1927: (NOV, 15), + 1928: (NOV, 4), + 1929: (OCT, 24), + 1931: (NOV, 2), + 1932: (NOV, 20), + 1933: (NOV, 9), + 1934: (OCT, 29), + 1935: (NOV, 17), + 1936: (NOV, 5), + 1937: (OCT, 26), + 1938: (NOV, 14), + 1940: (OCT, 23), + 1941: (NOV, 11), + 1942: (OCT, 31), + 1943: (NOV, 19), + 1944: (NOV, 7), + 1945: (OCT, 27), + 1946: (NOV, 15), + 1947: (NOV, 5), + 1948: (OCT, 24), + 1949: (NOV, 12), + 1950: (NOV, 2), + 1951: (NOV, 21), + 1952: (NOV, 9), + 1953: (OCT, 29), + 1954: (NOV, 17), + 1955: (NOV, 6), + 1956: (OCT, 26), + 1957: (NOV, 14), + 1958: (NOV, 3), + 1959: (NOV, 22), + 1960: (NOV, 10), + 1961: (OCT, 30), + 1962: (NOV, 18), + 1963: (NOV, 7), + 1964: (OCT, 27), + 1965: (NOV, 15), + 1966: (NOV, 5), + 1967: (OCT, 25), + 1968: (NOV, 12), + 1969: (NOV, 1), 1970: (NOV, 20), 1971: (NOV, 9), 1972: (OCT, 28), @@ -777,7 +1318,7 @@ class _TibetanLunisolar: 1983: (OCT, 28), 1984: (NOV, 15), 1985: (NOV, 5), - 1986: (OCT, 25), + 1986: (NOV, 23), 1987: (NOV, 12), 1988: (OCT, 31), 1989: (NOV, 19), @@ -795,7 +1336,7 @@ class _TibetanLunisolar: 2002: (OCT, 28), 2003: (NOV, 16), 2004: (NOV, 4), - 2005: (OCT, 24), + 2005: (NOV, 23), 2006: (NOV, 12), 2007: (NOV, 1), 2008: (NOV, 19), @@ -804,14 +1345,14 @@ class _TibetanLunisolar: 2011: (NOV, 17), 2012: (NOV, 6), 2013: (OCT, 26), - 2014: (NOV, 13), + 2014: (NOV, 14), 2015: (NOV, 3), 2016: (NOV, 20), 2017: (NOV, 10), 2018: (OCT, 31), 2019: (NOV, 19), 2020: (NOV, 7), - 2021: (OCT, 27), + 2021: (OCT, 28), 2022: (NOV, 15), 2023: (NOV, 4), 2024: (NOV, 22), @@ -841,7 +1382,7 @@ class _TibetanLunisolar: 2048: (OCT, 29), 2049: (NOV, 16), 2050: (NOV, 5), - 2051: (OCT, 26), + 2051: (NOV, 24), 2052: (NOV, 13), 2053: (NOV, 2), 2054: (NOV, 21), @@ -860,7 +1401,7 @@ class _TibetanLunisolar: 2067: (OCT, 29), 2068: (NOV, 16), 2069: (NOV, 5), - 2070: (OCT, 26), + 2070: (NOV, 24), 2071: (NOV, 14), 2072: (NOV, 2), 2073: (NOV, 21), @@ -890,9 +1431,77 @@ class _TibetanLunisolar: 2097: (OCT, 27), 2098: (NOV, 15), 2099: (NOV, 5), + 2100: (NOV, 24), } LOSAR_DATES = { + 1900: (MAR, 2), + 1902: (FEB, 9), + 1903: (FEB, 28), + 1904: (FEB, 17), + 1905: (FEB, 5), + 1906: (FEB, 24), + 1907: (FEB, 13), + 1908: (FEB, 3), + 1909: (FEB, 21), + 1910: (FEB, 10), + 1911: (MAR, 1), + 1912: (FEB, 19), + 1913: (FEB, 7), + 1914: (FEB, 25), + 1915: (FEB, 15), + 1916: (FEB, 4), + 1917: (FEB, 22), + 1918: (FEB, 12), + 1919: (MAR, 3), + 1920: (FEB, 20), + 1921: (FEB, 8), + 1922: (FEB, 27), + 1923: (FEB, 16), + 1924: (FEB, 5), + 1925: (FEB, 23), + 1926: (FEB, 13), + 1927: (FEB, 3), + 1928: (FEB, 22), + 1929: (FEB, 10), + 1930: (MAR, 1), + 1931: (FEB, 18), + 1932: (FEB, 7), + 1933: (FEB, 25), + 1934: (FEB, 14), + 1935: (FEB, 4), + 1936: (FEB, 23), + 1937: (FEB, 12), + 1938: (MAR, 3), + 1939: (FEB, 20), + 1940: (FEB, 9), + 1941: (FEB, 27), + 1942: (FEB, 16), + 1943: (FEB, 5), + 1945: (FEB, 13), + 1946: (FEB, 3), + 1947: (FEB, 21), + 1948: (FEB, 11), + 1949: (FEB, 28), + 1950: (FEB, 17), + 1951: (FEB, 7), + 1952: (FEB, 26), + 1953: (FEB, 14), + 1954: (FEB, 4), + 1955: (FEB, 23), + 1956: (FEB, 12), + 1957: (MAR, 2), + 1958: (FEB, 19), + 1959: (FEB, 8), + 1960: (FEB, 27), + 1961: (FEB, 16), + 1962: (FEB, 5), + 1964: (FEB, 14), + 1965: (MAR, 4), + 1966: (FEB, 21), + 1967: (FEB, 10), + 1968: (FEB, 29), + 1969: (FEB, 17), 1970: (FEB, 7), 1971: (FEB, 26), 1972: (FEB, 15), @@ -907,7 +1516,7 @@ class _TibetanLunisolar: 1981: (FEB, 5), 1982: (FEB, 24), 1983: (FEB, 13), - 1984: (FEB, 2), + 1984: (MAR, 3), 1985: (FEB, 20), 1986: (FEB, 9), 1987: (FEB, 28), @@ -933,8 +1542,8 @@ class _TibetanLunisolar: 2007: (FEB, 18), 2008: (FEB, 8), 2009: (FEB, 25), - 2010: (FEB, 14), - 2011: (FEB, 3), + 2010: (FEB, 15), + 2011: (FEB, 4), 2012: (FEB, 22), 2013: (FEB, 11), 2014: (MAR, 2), @@ -953,7 +1562,7 @@ class _TibetanLunisolar: 2027: (FEB, 7), 2028: (FEB, 26), 2029: (FEB, 14), - 2030: (FEB, 3), + 2030: (MAR, 5), 2031: (FEB, 22), 2032: (FEB, 12), 2033: (MAR, 2), @@ -972,7 +1581,7 @@ class _TibetanLunisolar: 2046: (FEB, 6), 2047: (FEB, 25), 2048: (FEB, 14), - 2049: (FEB, 3), + 2049: (MAR, 4), 2050: (FEB, 22), 2051: (FEB, 12), 2052: (MAR, 2), @@ -995,8 +1604,8 @@ class _TibetanLunisolar: 2069: (FEB, 22), 2070: (FEB, 12), 2071: (MAR, 2), - 2072: (FEB, 19), - 2073: (FEB, 7), + 2072: (FEB, 20), + 2073: (FEB, 8), 2074: (FEB, 26), 2075: (FEB, 16), 2076: (FEB, 5), @@ -1018,277 +1627,465 @@ class _TibetanLunisolar: 2092: (FEB, 8), 2093: (FEB, 26), 2094: (FEB, 16), - 2095: (FEB, 5), + 2095: (MAR, 7), 2096: (FEB, 24), 2097: (FEB, 13), 2098: (MAR, 4), 2099: (FEB, 21), + 2100: (FEB, 10), } THIMPHU_DRUBCHEN_DATES = { - 1970: (OCT, 6), - 1971: (SEP, 25), - 1972: (SEP, 13), - 1973: (OCT, 2), - 1974: (SEP, 21), - 1975: (SEP, 11), - 1976: (SEP, 29), - 1978: (SEP, 8), - 1979: (SEP, 27), - 1980: (SEP, 15), - 1981: (OCT, 4), - 1982: (SEP, 23), - 1983: (SEP, 12), - 1984: (SEP, 30), - 1985: (SEP, 20), - 1987: (SEP, 28), - 1988: (SEP, 17), - 1989: (OCT, 6), - 1990: (SEP, 25), - 1991: (SEP, 14), - 1992: (OCT, 2), - 1993: (SEP, 21), - 1994: (SEP, 11), - 1995: (SEP, 30), - 1996: (SEP, 18), - 1997: (OCT, 7), - 1998: (SEP, 26), - 1999: (SEP, 16), - 2000: (OCT, 3), - 2001: (SEP, 23), - 2002: (SEP, 12), - 2003: (OCT, 1), - 2004: (SEP, 20), - 2005: (SEP, 9), - 2006: (SEP, 28), - 2007: (SEP, 17), - 2008: (OCT, 5), - 2009: (SEP, 24), - 2010: (SEP, 13), - 2011: (OCT, 2), - 2012: (SEP, 21), - 2013: (SEP, 11), - 2014: (SEP, 29), - 2015: (SEP, 19), - 2016: (OCT, 7), - 2017: (SEP, 26), - 2018: (SEP, 15), - 2019: (OCT, 4), - 2020: (SEP, 22), - 2021: (SEP, 11), - 2022: (SEP, 30), - 2023: (SEP, 20), - 2024: (SEP, 9), - 2025: (SEP, 28), - 2026: (SEP, 17), - 2027: (OCT, 5), - 2028: (SEP, 24), - 2029: (SEP, 13), - 2030: (OCT, 2), - 2031: (SEP, 22), - 2032: (SEP, 11), - 2033: (SEP, 29), - 2034: (SEP, 18), - 2035: (OCT, 7), - 2036: (SEP, 25), - 2037: (SEP, 15), - 2038: (OCT, 4), - 2039: (SEP, 23), - 2040: (SEP, 12), - 2041: (OCT, 1), - 2042: (SEP, 20), - 2043: (SEP, 9), - 2044: (SEP, 27), - 2045: (SEP, 16), - 2046: (OCT, 5), - 2047: (SEP, 25), - 2048: (SEP, 13), - 2049: (OCT, 2), - 2050: (SEP, 22), - 2051: (SEP, 11), - 2052: (SEP, 29), - 2053: (SEP, 18), - 2054: (OCT, 7), - 2055: (SEP, 26), - 2056: (SEP, 15), - 2057: (OCT, 4), - 2058: (SEP, 23), - 2059: (SEP, 13), - 2060: (SEP, 30), - 2061: (SEP, 19), - 2062: (OCT, 8), - 2063: (SEP, 27), - 2064: (SEP, 16), - 2065: (OCT, 5), - 2066: (SEP, 25), - 2067: (SEP, 14), - 2068: (OCT, 2), - 2069: (SEP, 21), - 2070: (SEP, 10), - 2071: (SEP, 29), - 2072: (SEP, 17), - 2073: (OCT, 6), - 2074: (SEP, 26), - 2075: (SEP, 16), - 2076: (OCT, 4), - 2077: (SEP, 23), - 2078: (SEP, 12), - 2079: (OCT, 1), - 2080: (SEP, 19), - 2081: (OCT, 8), - 2082: (SEP, 27), - 2083: (SEP, 17), - 2084: (OCT, 5), - 2085: (SEP, 25), - 2086: (SEP, 14), - 2087: (OCT, 3), - 2088: (SEP, 21), - 2089: (SEP, 10), - 2090: (SEP, 29), - 2091: (SEP, 18), - 2092: (OCT, 6), - 2093: (SEP, 26), - 2094: (SEP, 16), - 2095: (OCT, 4), - 2096: (SEP, 22), - 2097: (SEP, 11), - 2098: (SEP, 30), - 2099: (SEP, 20), + 1900: (OCT, 9), + 1901: (SEP, 29), + 1902: (SEP, 18), + 1903: (OCT, 7), + 1904: (SEP, 25), + 1905: (OCT, 14), + 1906: (OCT, 3), + 1907: (SEP, 22), + 1908: (OCT, 10), + 1909: (SEP, 30), + 1910: (SEP, 20), + 1911: (OCT, 9), + 1912: (SEP, 27), + 1913: (OCT, 16), + 1914: (OCT, 5), + 1915: (SEP, 24), + 1916: (OCT, 12), + 1917: (OCT, 1), + 1918: (SEP, 21), + 1919: (OCT, 10), + 1920: (SEP, 29), + 1921: (SEP, 18), + 1922: (OCT, 7), + 1923: (SEP, 26), + 1924: (OCT, 13), + 1925: (OCT, 3), + 1926: (SEP, 22), + 1927: (OCT, 11), + 1928: (SEP, 30), + 1929: (SEP, 19), + 1930: (OCT, 8), + 1931: (SEP, 27), + 1932: (OCT, 15), + 1933: (OCT, 4), + 1934: (SEP, 24), + 1935: (OCT, 13), + 1936: (OCT, 1), + 1937: (SEP, 21), + 1938: (OCT, 10), + 1939: (SEP, 29), + 1940: (SEP, 17), + 1941: (OCT, 6), + 1942: (SEP, 25), + 1943: (OCT, 14), + 1944: (OCT, 3), + 1945: (SEP, 22), + 1946: (OCT, 11), + 1947: (OCT, 1), + 1948: (SEP, 19), + 1949: (OCT, 8), + 1950: (SEP, 27), + 1951: (OCT, 15), + 1952: (OCT, 4), + 1953: (SEP, 24), + 1954: (OCT, 13), + 1955: (OCT, 2), + 1956: (SEP, 21), + 1957: (OCT, 9), + 1958: (SEP, 28), + 1959: (OCT, 17), + 1960: (OCT, 5), + 1961: (SEP, 25), + 1962: (OCT, 14), + 1963: (OCT, 4), + 1964: (SEP, 22), + 1965: (OCT, 11), + 1966: (SEP, 30), + 1967: (SEP, 19), + 1968: (OCT, 7), + 1969: (SEP, 26), + 1970: (OCT, 15), + 1971: (OCT, 5), + 1972: (SEP, 24), + 1973: (OCT, 13), + 1974: (OCT, 2), + 1975: (SEP, 21), + 1976: (OCT, 9), + 1977: (SEP, 28), + 1978: (OCT, 17), + 1979: (OCT, 6), + 1980: (SEP, 25), + 1981: (OCT, 14), + 1982: (OCT, 3), + 1983: (SEP, 23), + 1984: (OCT, 10), + 1985: (SEP, 30), + 1986: (SEP, 19), + 1987: (OCT, 8), + 1988: (SEP, 26), + 1989: (OCT, 15), + 1990: (OCT, 5), + 1991: (SEP, 24), + 1992: (OCT, 12), + 1993: (OCT, 1), + 1994: (SEP, 20), + 1995: (OCT, 9), + 1998: (OCT, 6), + 1999: (SEP, 26), + 2000: (OCT, 14), + 2001: (OCT, 3), + 2002: (SEP, 22), + 2003: (OCT, 11), + 2004: (SEP, 29), + 2007: (SEP, 27), + 2008: (OCT, 15), + 2009: (OCT, 5), + 2010: (SEP, 24), + 2011: (OCT, 13), + 2012: (OCT, 1), + 2013: (SEP, 20), + 2014: (OCT, 9), + 2016: (OCT, 17), + 2017: (OCT, 6), + 2018: (SEP, 26), + 2019: (OCT, 14), + 2020: (OCT, 2), + 2021: (SEP, 21), + 2022: (OCT, 10), + 2023: (SEP, 30), + 2024: (OCT, 18), + 2025: (OCT, 8), + 2026: (SEP, 27), + 2027: (OCT, 16), + 2028: (OCT, 4), + 2029: (SEP, 23), + 2030: (OCT, 12), + 2031: (OCT, 1), + 2032: (SEP, 20), + 2033: (OCT, 9), + 2036: (OCT, 6), + 2037: (SEP, 25), + 2038: (OCT, 14), + 2039: (OCT, 3), + 2040: (SEP, 21), + 2041: (OCT, 10), + 2042: (SEP, 30), + 2043: (OCT, 19), + 2044: (OCT, 7), + 2045: (SEP, 27), + 2046: (OCT, 15), + 2047: (OCT, 4), + 2048: (SEP, 23), + 2049: (OCT, 12), + 2050: (OCT, 1), + 2051: (SEP, 21), + 2052: (OCT, 9), + 2053: (SEP, 28), + 2054: (OCT, 17), + 2055: (OCT, 6), + 2056: (SEP, 24), + 2057: (OCT, 13), + 2059: (SEP, 22), + 2060: (OCT, 10), + 2061: (SEP, 30), + 2062: (OCT, 19), + 2063: (OCT, 8), + 2064: (SEP, 26), + 2065: (OCT, 15), + 2066: (OCT, 4), + 2067: (SEP, 23), + 2069: (OCT, 1), + 2070: (SEP, 21), + 2071: (OCT, 10), + 2072: (SEP, 28), + 2073: (OCT, 17), + 2074: (OCT, 6), + 2075: (SEP, 25), + 2076: (OCT, 13), + 2078: (SEP, 22), + 2079: (OCT, 11), + 2080: (SEP, 30), + 2081: (OCT, 18), + 2082: (OCT, 7), + 2083: (SEP, 26), + 2084: (OCT, 14), + 2085: (OCT, 4), + 2088: (OCT, 1), + 2089: (OCT, 20), + 2090: (OCT, 9), + 2091: (SEP, 28), + 2092: (OCT, 16), + 2093: (OCT, 5), + 2094: (SEP, 25), + 2095: (OCT, 14), + 2097: (SEP, 22), + 2098: (OCT, 11), + 2099: (SEP, 30), + 2100: (OCT, 19), } THIMPHU_TSHECHU_DATES = { - 1970: (OCT, 10), - 1971: (SEP, 29), - 1972: (SEP, 18), - 1973: (OCT, 6), - 1974: (SEP, 25), - 1975: (SEP, 15), - 1977: (SEP, 22), - 1978: (SEP, 12), - 1979: (OCT, 1), - 1980: (SEP, 19), - 1981: (OCT, 8), - 1982: (SEP, 27), - 1983: (SEP, 16), - 1984: (OCT, 4), - 1985: (SEP, 23), - 1986: (SEP, 13), - 1987: (OCT, 2), - 1988: (SEP, 21), - 1989: (OCT, 10), - 1990: (SEP, 29), - 1991: (SEP, 18), - 1992: (OCT, 6), - 1993: (SEP, 25), - 1994: (SEP, 14), - 1995: (OCT, 3), - 1996: (SEP, 22), - 1997: (OCT, 11), - 1998: (OCT, 1), - 1999: (SEP, 20), - 2000: (OCT, 8), - 2001: (SEP, 27), - 2002: (SEP, 16), - 2003: (OCT, 5), - 2004: (SEP, 23), - 2005: (SEP, 13), - 2006: (OCT, 2), - 2007: (SEP, 22), - 2008: (OCT, 9), - 2009: (SEP, 28), - 2010: (SEP, 17), - 2011: (OCT, 6), - 2012: (SEP, 25), - 2013: (SEP, 14), - 2014: (OCT, 3), - 2015: (SEP, 23), - 2016: (OCT, 11), - 2017: (SEP, 30), - 2018: (SEP, 19), - 2019: (OCT, 8), - 2020: (SEP, 26), - 2021: (SEP, 15), - 2022: (OCT, 4), - 2023: (SEP, 24), - 2024: (SEP, 13), - 2025: (OCT, 2), - 2026: (SEP, 21), - 2027: (OCT, 10), - 2028: (SEP, 28), - 2029: (SEP, 17), - 2030: (OCT, 6), - 2031: (SEP, 26), - 2032: (SEP, 14), - 2033: (OCT, 3), - 2034: (SEP, 23), - 2035: (OCT, 11), - 2036: (SEP, 29), - 2037: (SEP, 19), - 2038: (OCT, 7), - 2039: (SEP, 27), - 2040: (SEP, 16), - 2041: (OCT, 5), - 2042: (SEP, 24), - 2043: (SEP, 13), - 2044: (OCT, 1), - 2045: (SEP, 20), - 2046: (OCT, 9), - 2047: (SEP, 28), - 2048: (SEP, 17), - 2049: (OCT, 6), - 2050: (SEP, 26), - 2051: (SEP, 15), - 2052: (OCT, 3), - 2053: (SEP, 22), - 2054: (OCT, 11), - 2055: (SEP, 30), - 2056: (SEP, 18), - 2057: (OCT, 7), - 2058: (SEP, 27), - 2059: (SEP, 17), - 2060: (OCT, 5), - 2061: (SEP, 24), - 2062: (OCT, 12), - 2063: (OCT, 2), - 2064: (SEP, 20), - 2065: (OCT, 9), - 2066: (SEP, 28), - 2067: (SEP, 18), - 2068: (OCT, 6), - 2069: (SEP, 25), - 2070: (SEP, 15), - 2071: (OCT, 3), - 2072: (SEP, 21), - 2073: (OCT, 10), - 2074: (SEP, 30), - 2075: (SEP, 19), - 2076: (OCT, 7), - 2077: (SEP, 27), - 2078: (SEP, 16), - 2079: (OCT, 5), - 2080: (SEP, 23), - 2081: (OCT, 12), - 2082: (OCT, 1), - 2083: (SEP, 21), - 2084: (OCT, 9), - 2085: (SEP, 28), - 2086: (SEP, 18), - 2087: (OCT, 7), - 2088: (SEP, 25), - 2089: (SEP, 14), - 2090: (OCT, 3), - 2091: (SEP, 22), - 2092: (OCT, 10), - 2093: (SEP, 30), - 2094: (SEP, 19), - 2095: (OCT, 8), - 2096: (SEP, 27), - 2097: (SEP, 16), - 2098: (OCT, 4), - 2099: (SEP, 24), + 1900: (OCT, 13), + 1901: (OCT, 2), + 1902: (SEP, 22), + 1903: (OCT, 11), + 1904: (SEP, 29), + 1905: (OCT, 18), + 1906: (OCT, 7), + 1907: (SEP, 26), + 1908: (OCT, 14), + 1909: (OCT, 4), + 1910: (SEP, 23), + 1911: (OCT, 12), + 1912: (OCT, 1), + 1913: (OCT, 20), + 1914: (OCT, 9), + 1915: (SEP, 28), + 1916: (OCT, 16), + 1917: (OCT, 5), + 1919: (OCT, 14), + 1920: (OCT, 2), + 1921: (SEP, 22), + 1922: (OCT, 11), + 1923: (SEP, 30), + 1924: (OCT, 18), + 1925: (OCT, 7), + 1926: (SEP, 26), + 1927: (OCT, 15), + 1928: (OCT, 4), + 1929: (SEP, 23), + 1930: (OCT, 12), + 1931: (OCT, 2), + 1932: (OCT, 19), + 1933: (OCT, 8), + 1934: (SEP, 27), + 1935: (OCT, 16), + 1936: (OCT, 5), + 1937: (SEP, 25), + 1938: (OCT, 14), + 1939: (OCT, 3), + 1940: (SEP, 21), + 1941: (OCT, 10), + 1942: (SEP, 29), + 1943: (OCT, 18), + 1944: (OCT, 6), + 1945: (SEP, 26), + 1946: (OCT, 15), + 1947: (OCT, 5), + 1948: (SEP, 23), + 1949: (OCT, 12), + 1950: (OCT, 1), + 1951: (OCT, 20), + 1952: (OCT, 8), + 1953: (SEP, 27), + 1954: (OCT, 16), + 1955: (OCT, 6), + 1956: (SEP, 25), + 1957: (OCT, 13), + 1958: (OCT, 3), + 1959: (OCT, 21), + 1960: (OCT, 9), + 1961: (SEP, 29), + 1962: (OCT, 18), + 1963: (OCT, 7), + 1964: (SEP, 26), + 1965: (OCT, 15), + 1966: (OCT, 4), + 1967: (SEP, 23), + 1968: (OCT, 11), + 1969: (SEP, 30), + 1970: (OCT, 19), + 1972: (SEP, 27), + 1973: (OCT, 16), + 1974: (OCT, 6), + 1975: (SEP, 25), + 1976: (OCT, 13), + 1977: (OCT, 2), + 1978: (OCT, 21), + 1979: (OCT, 10), + 1982: (OCT, 7), + 1983: (SEP, 27), + 1984: (OCT, 15), + 1985: (OCT, 4), + 1986: (SEP, 23), + 1987: (OCT, 12), + 1988: (SEP, 30), + 1989: (OCT, 19), + 1991: (SEP, 28), + 1992: (OCT, 16), + 1993: (OCT, 6), + 1994: (SEP, 25), + 1995: (OCT, 13), + 1996: (OCT, 1), + 1997: (OCT, 20), + 1998: (OCT, 10), + 2000: (OCT, 18), + 2001: (OCT, 7), + 2002: (SEP, 26), + 2003: (OCT, 15), + 2004: (OCT, 3), + 2005: (SEP, 22), + 2006: (OCT, 11), + 2007: (OCT, 1), + 2008: (OCT, 19), + 2009: (OCT, 9), + 2010: (SEP, 28), + 2011: (OCT, 17), + 2012: (OCT, 5), + 2013: (SEP, 24), + 2014: (OCT, 13), + 2015: (OCT, 2), + 2016: (OCT, 20), + 2017: (OCT, 10), + 2019: (OCT, 18), + 2020: (OCT, 7), + 2021: (SEP, 26), + 2022: (OCT, 14), + 2023: (OCT, 4), + 2024: (SEP, 22), + 2025: (OCT, 11), + 2026: (OCT, 1), + 2027: (OCT, 20), + 2028: (OCT, 8), + 2029: (SEP, 27), + 2030: (OCT, 16), + 2031: (OCT, 5), + 2034: (OCT, 2), + 2035: (OCT, 21), + 2036: (OCT, 10), + 2037: (SEP, 29), + 2038: (OCT, 18), + 2039: (OCT, 7), + 2040: (SEP, 25), + 2041: (OCT, 14), + 2042: (OCT, 3), + 2043: (SEP, 23), + 2044: (OCT, 11), + 2045: (OCT, 1), + 2046: (OCT, 20), + 2047: (OCT, 9), + 2048: (SEP, 27), + 2049: (OCT, 16), + 2050: (OCT, 5), + 2051: (SEP, 24), + 2053: (OCT, 2), + 2054: (OCT, 21), + 2055: (OCT, 10), + 2056: (SEP, 29), + 2057: (OCT, 17), + 2058: (OCT, 6), + 2059: (SEP, 26), + 2060: (OCT, 14), + 2063: (OCT, 12), + 2064: (SEP, 30), + 2065: (OCT, 19), + 2066: (OCT, 8), + 2067: (SEP, 27), + 2068: (OCT, 15), + 2069: (OCT, 5), + 2072: (OCT, 2), + 2073: (OCT, 21), + 2074: (OCT, 10), + 2075: (SEP, 29), + 2076: (OCT, 17), + 2077: (OCT, 6), + 2078: (SEP, 26), + 2079: (OCT, 15), + 2080: (OCT, 3), + 2081: (OCT, 22), + 2082: (OCT, 12), + 2083: (OCT, 1), + 2084: (OCT, 18), + 2085: (OCT, 8), + 2086: (SEP, 27), + 2087: (OCT, 16), + 2088: (OCT, 5), + 2089: (OCT, 24), + 2090: (OCT, 13), + 2091: (OCT, 2), + 2092: (OCT, 20), + 2093: (OCT, 9), + 2094: (SEP, 28), + 2095: (OCT, 17), + 2096: (OCT, 6), + 2097: (SEP, 26), + 2098: (OCT, 15), + 2099: (OCT, 4), + 2100: (OCT, 23), } WINTER_SOLSTICE_DATES = { + 1901: (JAN, 2), + 1902: (JAN, 2), + 1903: (JAN, 2), + 1904: (JAN, 2), + 1905: (JAN, 2), + 1906: (JAN, 2), + 1907: (JAN, 2), + 1908: (JAN, 2), + 1909: (JAN, 2), + 1910: (JAN, 2), + 1911: (JAN, 2), + 1912: (JAN, 2), + 1913: (JAN, 2), + 1914: (JAN, 2), + 1915: (JAN, 2), + 1916: (JAN, 2), + 1917: (JAN, 2), + 1918: (JAN, 2), + 1919: (JAN, 2), + 1920: (JAN, 2), + 1921: (JAN, 2), + 1922: (JAN, 2), + 1923: (JAN, 2), + 1924: (JAN, 2), + 1925: (JAN, 2), + 1926: (JAN, 2), + 1927: (JAN, 2), + 1928: (JAN, 2), + 1929: (JAN, 2), + 1930: (JAN, 2), + 1931: (JAN, 2), + 1932: (JAN, 2), + 1933: (JAN, 2), + 1934: (JAN, 2), + 1935: (JAN, 2), + 1936: (JAN, 2), + 1937: (JAN, 2), + 1938: (JAN, 2), + 1939: (JAN, 2), + 1940: (JAN, 2), + 1941: (JAN, 2), + 1942: (JAN, 2), + 1943: (JAN, 2), + 1944: (JAN, 2), + 1945: (JAN, 2), + 1946: (JAN, 2), + 1947: (JAN, 2), + 1948: (JAN, 2), + 1949: (JAN, 2), + 1950: (JAN, 2), + 1951: (JAN, 2), + 1952: (JAN, 2), + 1953: (JAN, 2), + 1954: (JAN, 2), + 1955: (JAN, 2), + 1956: (JAN, 2), + 1957: (JAN, 2), + 1958: (JAN, 2), + 1959: (JAN, 2), + 1960: (JAN, 2), + 1961: (JAN, 2), + 1962: (JAN, 2), + 1963: (JAN, 2), + 1964: (JAN, 2), + 1965: (JAN, 2), + 1966: (JAN, 2), + 1967: (JAN, 2), + 1968: (JAN, 2), + 1969: (JAN, 2), 1970: (JAN, 2), 1971: (JAN, 2), 1972: (JAN, 2), @@ -1338,10 +2135,10 @@ class _TibetanLunisolar: 2016: (JAN, 2), 2017: (JAN, 2), 2018: (JAN, 2), - 2019: (JAN, 3), + 2019: (JAN, 2), 2020: (JAN, 2), 2021: (JAN, 2), - 2022: (JAN, 1), + 2022: (JAN, 2), 2023: (JAN, 2), 2024: (JAN, 2), 2025: (JAN, 2), @@ -1419,6 +2216,8 @@ class _TibetanLunisolar: 2097: (JAN, 2), 2098: (JAN, 2), 2099: (JAN, 2), + 2100: (JAN, 2), + 2101: (JAN, 2), } def _get_holiday(self, holiday: str, year: int) -> tuple[date | None, bool]: diff --git a/scripts/calendar/tibetan_generator.py b/scripts/calendar/tibetan_generator.py new file mode 100644 index 0000000000..346c2991a4 --- /dev/null +++ b/scripts/calendar/tibetan_generator.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 + +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +# ruff: noqa: S310 + +import ast +from pathlib import Path +from urllib.request import urlretrieve + +DATA_URL = "https://raw.githubusercontent.com/wp-plugins/bhutanese-calendar/master/data/data.txt" +DATA_FILENAME = "tibetan_data.txt" + +CLASS_NAME = "_TibetanLunisolar" +OUT_FILE_NAME = "tibetan_dates.py" + +# (tibetan_day, tibetan_month, holiday_name) +# Data tuple format: (day_of_year, weekday, tib_day, tib_month, leap, +# tib_year_name, greg_day, greg_month, greg_year) +HOLIDAY_DATES = ( + (1, 1, "LOSAR"), + (10, 3, "DEATH_OF_ZHABDRUNG"), + (15, 4, "BUDDHA_PARINIRVANA"), + (10, 5, "BIRTH_OF_GURU_RINPOCHE"), + (4, 6, "BUDDHA_FIRST_SERMON"), + (16, 8, "THIMPHU_DRUBCHEN"), + (20, 8, "THIMPHU_TSHECHU"), + (22, 9, "DESCENDING_DAY_OF_LORD_BUDDHA"), + (30, 11, "DAY_OF_OFFERING"), +) + +MONTH_NAMES = { + 1: "JAN", + 2: "FEB", + 3: "MAR", + 4: "APR", + 5: "MAY", + 6: "JUN", + 7: "JUL", + 8: "AUG", + 9: "SEP", + 10: "OCT", + 11: "NOV", + 12: "DEC", +} + +CLASS_TEMPLATE = """class {class_name}: +{holiday_data}""" + +HOLIDAY_DATA_TEMPLATE = """ {hol_name}_DATES = {{ +{year_dates} + }} +""" + +YEAR_TEMPLATE = " {year}: {dates}," + + +def generate_data() -> None: + data_file = Path(__file__).parent / DATA_FILENAME + + if not data_file.exists(): + urlretrieve(DATA_URL, data_file) + + with open(data_file, encoding="utf-8") as f: + all_days = [ + ast.literal_eval(line.strip().rstrip(",")) + for line in f + if line.strip() and not line.strip().startswith("#") + ] + + if not all_days: + raise RuntimeError(f"No data parsed from {data_file}") + + dates: dict[str, dict[int, list[str]]] = {} + + for tib_day, tib_month, hol_name in HOLIDAY_DATES: + for d in all_days: + if len(d) < 9: + continue + if d[2] == tib_day and d[3] == tib_month and not d[4]: + g_year, g_month, g_day = d[8], d[7], d[6] + date_str = f"({MONTH_NAMES[g_month]}, {g_day})" + dates.setdefault(hol_name, {}).setdefault(g_year, []).append(date_str) + + holiday_data = [] + for hol_name in sorted(dates.keys()): + year_dates = [] + for year, dt_list in sorted(dates[hol_name].items()): + if len(dt_list) == 1: + dates_str = dt_list[0] + else: + dates_str = f"({', '.join(dt_list)})" + year_dates.append(YEAR_TEMPLATE.format(year=year, dates=dates_str)) + holiday_data.append( + HOLIDAY_DATA_TEMPLATE.format(hol_name=hol_name, year_dates="\n".join(year_dates)) + ) + + class_str = CLASS_TEMPLATE.format( + class_name=CLASS_NAME, + holiday_data="\n".join(holiday_data), + ) + + output_path = Path(__file__).parent / OUT_FILE_NAME + output_path.write_text(class_str, encoding="UTF-8") + + +if __name__ == "__main__": + generate_data()