def _populate(self, year): # New Year's Day name = "New Year's Day" self[date(year, 1, 1)] = name # New Year's Day by the Lunar name = "New Year's Day by the Lunar" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 1)).to_date() if ds.year == year: self[ds] = name # Independence Movement Day name = "Independence Movement Day" self[date(year, 3, 1)] = name # Buddha's Birthday name = "Buddha's Birthday" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 4, 8)).to_date() if ds.year == year: self[ds] = name # Children's Day name = "Children's Day" self[date(year, 5, 5)] = name # Memorial Day name = "Memorial Day" self[date(year, 6, 6)] = name # Liberation Day name = "Liberation Day" self[date(year, 8, 15)] = name # Chuseok name = "Chuseok" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 8, 15)).to_date() if ds.year == year: self[ds] = name # National Foundation Day name = "National Foundation Day" self[date(year, 10, 3)] = name # Hangeul Proclamation Day name = "Hangeul Proclamation Day" self[date(year, 10, 9)] = name # Christmas Day name = "Christmas Day" self[date(year, 12, 25)] = name
def GetLunarInfo(unix_ts, time_conv): ethnic_time = datetime.fromtimestamp(unix_ts, LUNAR_TIMEZONE) lunar_date = Lunar.from_date(ethnic_time.date()) lunar_info = [ time_conv(ethnic_time.timetuple(), 1), (lunar_date.year, lunar_date.month, lunar_date.isleap, lunar_date.day) ] ethnic_date = ethnic_time.date() # Compute the progression of solar terms scan_year = lunar_date.year last_term = None next_term = None while not next_term: for i in range(24): term = solarterms[i] term_date = term(scan_year) if term_date <= ethnic_date: last_term = (i + 1, term, term_date) else: next_term = (i + 1, term, term_date) break scan_year += 1 lunar_info.append( (((last_term[0], last_term[1].langs[LUNAR_NATIVELANG][0], last_term[1].langs['en'][0]), (ethnic_date - last_term[2]).days), ((next_term[0], next_term[1].langs[LUNAR_NATIVELANG][0], next_term[1].langs['en'][0]), (next_term[2] - ethnic_date).days))) return lunar_info
def _populate(self, year): # New Year's Day name = "New Year's Day" self[date(year, 1, 1)] = name # Vietnamese New Year name = "Vietnamese New Year" for offset in range(-1, 2, 1): try: ds = Converter.Lunar2Solar(Lunar(year - 1 + offset, 12, 30)).to_date() except DateNotExist: ds = Converter.Lunar2Solar(Lunar(year - 1 + offset, 12, 29)).to_date() if ds.year == year: self[ds] = name ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 1)).to_date() if ds.year == year: self[ds] = name ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 2)).to_date() if ds.year == year: self[ds] = name ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 3)).to_date() if ds.year == year: self[ds] = name ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 4)).to_date() if ds.year == year: self[ds] = name ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 5)).to_date() if ds.year == year: self[ds] = name # Hung Kings Commemorations name = "Hung Kings Commemorations" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 3, 10)).to_date() if ds.year == year: self[ds] = name # Reunification Day name = "Reunification Day" self[date(year, 4, 30)] = name # Labor Day/International Workers' Day name = "Labor Day/International Workers' Day" self[date(year, 5, 1)] = name # National Day name = "National Day" self[date(year, 9, 2)] = name
def main(): results = {} for year in range(1900, 2100 + 1): for month in range(1, 12 + 1): try: lunar = Lunar(year, month, 1, isleap=True) print(lunar) results[lunar.month] = results.setdefault(lunar.month, 0) + 1 except DateNotExist: pass print("results:") for month in sorted(results.keys()): print("leap month is %3s, count: %3s" % (month, results[month]))
def show_lunar_leap_date(): ''' test if lunar(year, month) is leap using itertools ''' for n in it.product(list(range(2020, 2031)), list(range(1, 13))): try: (y, m) = n lunar = Lunar(y, m, 1, isleap=True) print(f'{lunar} => {lunar.to_date()}') except DateNotExist: #print(e) pass
def _populate(self, year): # New Year's Day name = "New Year's Day" self[date(year, 1, 1)] = name # Chinese New Year/ Spring Festival name = "Chinese New Year" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 1)).to_date() if ds.year == year: self[ds] = name # Tomb-Sweeping Day name = "Tomb-Sweeping Day" self[date(year, 4, 4)] = name self[date(year, 4, 5)] = name # Labor Day name = "Labor Day" self[date(year, 5, 1)] = name # Dragon Boat Festival name = "Dragon Boat Festival" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 5, 5)).to_date() if ds.year == year: self[ds] = name # Mid-Autumn Festival name = "Mid-Autumn Festival" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 8, 15)).to_date() if ds.year == year: self[ds] = name # National Day name = "National Day" self[date(year, 10, 1)] = name
def get_life(date): for hour in range(24): if hour == 23: new_date = date + datetime.timedelta(days=1) else: new_date = date luna_date = Lunar.from_date(new_date) score = round( YEAR_MAP[(luna_date.year + 40) % 60 + 1940] + MONTH_MAP[luna_date.month] + DAY_MAP[luna_date.day] + HOUR[hour], ndigits=1, ) life_language = LIFE_MAP[str(score)] weight_list = str(score).split(".") star = ">" * round((score - 2.1) * 3) yield ( score, f"{date.year}.{date.month:02}.{date.day:02} {hour:02}H " + f"{weight_list[0]}兩{weight_list[1]}錢 {star:14}" + f"你的八字真言為:{life_language}", )
def _populate(self, year): # New Year's Day if not self.observed and date(year, 1, 1).weekday() in WEEKEND: pass else: self[date(year, 1, 1)] = "New Year's Day" # Chinese New Year/ Spring Festival name = "Chinese New Year" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 1)).to_date() if ds.year == year: self[ds] = name # Day of Silence / Nyepi # Note: # This holiday is determined by Balinese calendar, which is not currently # available. Only hard coded version of this holiday from 2009 to 2019 # is available. warning_msg = "We only support Nyepi holiday from 2009 to 2019" log.warning(warning_msg) name = "Day of Silence/ Nyepi" if year == 2009: self[date(year, 3, 26)] = name elif year == 2010: self[date(year, 3, 16)] = name elif year == 2011: self[date(year, 3, 5)] = name elif year == 2012: self[date(year, 3, 23)] = name elif year == 2013: self[date(year, 3, 12)] = name elif year == 2014: self[date(year, 3, 31)] = name elif year == 2015: self[date(year, 3, 21)] = name elif year == 2016: self[date(year, 3, 9)] = name elif year == 2017: self[date(year, 3, 28)] = name elif year == 2018: self[date(year, 3, 17)] = name elif year == 2019: self[date(year, 3, 7)] = name else: pass # Ascension of the Prophet name = "Ascension of the Prophet" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 3, 17)[0] y, m, d = to_gregorian(islam_year, 7, 27) if y == year: self[date(y, m, d)] = name # Labor Day name = "Labor Day" self[date(year, 5, 1)] = name # Ascension of Jesus Christ name = "Ascension of Jesus" for offset in range(-1, 2, 1): ds = easter(year + offset) + rd(days=+39) if ds.year == year: self[ds] = name # Buddha's Birthday name = "Buddha's Birthday" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 4, 15)).to_date() if ds.year == year: self[ds] = name # Pancasila Day, since 2017 if year >= 2017: name = "Pancasila Day" self[date(year, 6, 1)] = name # Eid al-Fitr name = "Eid al-Fitr" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 6, 15)[0] y1, m1, d1 = to_gregorian(islam_year, 10, 1) y2, m2, d2 = to_gregorian(islam_year, 10, 2) if y1 == year: self[date(y1, m2, d2)] = name if y2 == year: self[date(y2, m2, d2)] = name # Independence Day name = "Independence Day" self[date(year, 8, 17)] = name # Feast of the Sacrifice name = "Feast of the Sacrifice" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 8, 22)[0] y, m, d = to_gregorian(islam_year, 12, 10) if y == year: self[date(y, m, d)] = name # Islamic New Year name = "Islamic New Year" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 9, 11)[0] y, m, d = to_gregorian(islam_year + 1, 1, 1) if y == year: self[date(y, m, d)] = name # Birth of the Prophet name = "Birth of the Prophet" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 11, 20)[0] y, m, d = to_gregorian(islam_year + 1, 3, 12) if y == year: self[date(y, m, d)] = name # Christmas self[date(year, 12, 25)] = "Christmas"
def _populate(self, year): # New Year's Day name = "New Year's Day" self[date(year, 1, 1)] = name # Magha Pujab # Note: # This holiday is determined by Buddhist calendar, which is not currently # available. Only hard coded version of this holiday from 2016 to 2019 # is available. name = "Magha Pujab/Makha Bucha" if year == 2016: self[date(year, 2, 22)] = name elif year == 2017: self[date(year, 2, 11)] = name elif year == 2018: self[date(year, 3, 1)] = name elif year == 2019: self[date(year, 2, 19)] = name else: pass # Chakri Memorial Day name = "Chakri Memorial Day" april_6 = date(year, 4, 6).weekday() if april_6 == 5: self[date(year, 4, 6 + 2)] = name elif april_6 == 6: self[date(year, 4, 6 + 1)] = name else: self[date(year, 4, 6)] = name # Songkran Festival name = "Songkran Festival" self[date(year, 4, 14)] = name # Royal Ploughing Ceremony # arbitrary day in May # Buddha's Birthday name = "Buddha's Birthday" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 4, 15)).to_date() if ds.year == year: self[ds] = name # Coronation Day, removed in 2017 name = "Coronation Day" if year < 2017: self[date(year, 5, 5)] = name # King Maha Vajiralongkorn's Birthday name = "King Maha Vajiralongkorn's Birthday" self[date(year, 7, 28)] = name # Asalha Puja # This is also a Buddha holiday, and we only implement # the hard coded version from 2006 to 2025 # reference: # http://www.when-is.com/asalha_puja.asp warning_msg = "We only support Asalha Puja holiday from 2006 to 2025" log.warning(warning_msg) name = "Asalha Puja" if year == 2006: self[date(year, 7, 11)] = name elif year == 2007: self[date(year, 6, 30)] = name elif year == 2008: self[date(year, 7, 18)] = name elif year == 2009: self[date(year, 7, 7)] = name elif year == 2010: self[date(year, 7, 25)] = name elif year == 2011: self[date(year, 7, 15)] = name elif year == 2012: self[date(year, 8, 2)] = name elif year == 2013: self[date(year, 7, 30)] = name elif year == 2014: self[date(year, 7, 13)] = name elif year == 2015: self[date(year, 7, 30)] = name elif year == 2016: self[date(year, 7, 15)] = name elif year == 2017: self[date(year, 7, 9)] = name elif year == 2018: self[date(year, 7, 29)] = name elif year == 2019: self[date(year, 7, 16)] = name elif year == 2020: self[date(year, 7, 5)] = name elif year == 2021: self[date(year, 7, 24)] = name elif year == 2022: self[date(year, 7, 13)] = name elif year == 2023: self[date(year, 7, 3)] = name elif year == 2024: self[date(year, 7, 21)] = name elif year == 2025: self[date(year, 7, 10)] = name else: pass # Beginning of Vassa warning_msg = "We only support Vassa holiday from 2006 to 2020" log.warning(warning_msg) name = "Beginning of Vassa" if year == 2006: self[date(year, 7, 12)] = name elif year == 2007: self[date(year, 7, 31)] = name elif year == 2008: self[date(year, 7, 19)] = name elif year == 2009: self[date(year, 7, 8)] = name elif year == 2010: self[date(year, 7, 27)] = name elif year == 2011: self[date(year, 7, 16)] = name elif year == 2012: self[date(year, 8, 3)] = name elif year == 2013: self[date(year, 7, 23)] = name elif year == 2014: self[date(year, 7, 13)] = name elif year == 2015: self[date(year, 8, 1)] = name elif year == 2016: self[date(year, 7, 20)] = name elif year == 2017: self[date(year, 7, 9)] = name elif year == 2018: self[date(year, 7, 28)] = name elif year == 2019: self[date(year, 7, 17)] = name elif year == 2020: self[date(year, 7, 6)] = name else: pass # The Queen Sirikit's Birthday name = "The Queen Sirikit's Birthday" self[date(year, 8, 12)] = name # Anniversary for the Death of King Bhumibol Adulyadej name = "Anniversary for the Death of King Bhumibol Adulyadej" self[date(year, 10, 13)] = name # King Chulalongkorn Day name = "King Chulalongkorn Day" self[date(year, 10, 23)] = name # King Bhumibol Adulyadej's Birthday Anniversary name = "King Bhumibol Adulyadej's Birthday Anniversary" self[date(year, 12, 5)] = name # Constitution Day name = "Constitution Day" self[date(year, 12, 10)] = name # New Year's Eve name = "New Year's Eve" self[date(year, 12, 31)] = name
def _populate(self, year): # New Year's Day name = "New Year's Day" self[date(year, 1, 1)] = name # Birthday of Prophet, Mawlid in India # 12th day of 3rd Islamic month name = "Birth of Prophet" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 11, 20)[0] y, m, d = to_gregorian(islam_year, 3, 12) if y == year: self[date(y, m, d)] = name # Chinese New Year name = "Chinese New Year" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 1, 1)).to_date() if ds.year == year: self[ds] = name # Tamil New Year # Note: it's not necessarily 04/14 # due to the local calendar # other possible dates are 04/13 and 04/15 name = "Tamil New Year" self[date(year, 4, 14)] = name # Good Friday name = "Good Friday" for offset in range(-1, 2, 1): ds = easter(year + offset) - rd(days=2) if ds.year == year: self[ds] = name # Labor Day name = "Labor Day" self[date(year, 5, 1)] = name # Buddha's Birthday name = "Wesak Day" for offset in range(-1, 2, 1): ds = Converter.Lunar2Solar(Lunar(year + offset, 4, 15)).to_date() if ds.year == year: self[ds] = name # King's birthday # https://www.thestar.com.my/news/nation/2017/04/26/ # Before 2017: first Saturday of June # 2017-2021: last Saturday of July name = "King's birthday" if year < 2017: c = Calendar(firstweekday=MONDAY) monthcal = c.monthdatescalendar(year, 6) l1 = len(monthcal) saturdays = [] for i in range(l1): if monthcal[i][5].month == 6: saturdays.append(monthcal[i][5]) self[saturdays[0]] = name elif (year >= 2017) and (year <= 2021): c = Calendar(firstweekday=MONDAY) monthcal = c.monthdatescalendar(year, 7) l1 = len(monthcal) saturdays = [] for i in range(l1): if monthcal[i][5].month == 7: saturdays.append(monthcal[i][5]) self[saturdays[-1]] = name # Eid al-Fitr name = "Eid al-Fitr" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 6, 15)[0] y1, m1, d1 = to_gregorian(islam_year, 10, 1) y2, m2, d2 = to_gregorian(islam_year, 10, 2) if y1 == year: self[date(y1, m1, d1)] = name if y2 == year: self[date(y2, m2, d2)] = name # Malaysia Day name = "Malaysia Day" self[date(year, 9, 16)] = name # Feast of the Sacrifice name = "Feast of the Sacrifice" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 8, 22)[0] y, m, d = to_gregorian(islam_year, 12, 10) if y == year: self[date(y, m, d)] = name # First Day of Muharram name = "First Day of Muharram" for offset in range(-1, 2, 1): islam_year = from_gregorian(year + offset, 9, 11)[0] y, m, d = to_gregorian(islam_year + 1, 1, 1) if y == year: self[date(y, m, d)] = name # Christmas name = "Christmas Day" self[date(year, 12, 25)] = name
if __name__ == '__main__': # solar converts to lunar, then converts to solar solar = Solar(2018, 1, 1) print(solar) lunar = Converter.Solar2Lunar(solar) print(lunar) solar = Converter.Lunar2Solar(lunar) print(solar) print(solar.to_date(), type(solar.to_date())) print(Solar.from_date(datetime.date(2018, 1, 1))) print('=' * 20) # lunar converts to solar, then converts to solar lunar = Lunar(2018, 2, 30, isleap=False) print(lunar) solar = Converter.Lunar2Solar(lunar) print(solar) lunar = Converter.Solar2Lunar(solar) print(lunar) print(lunar.to_date(), type(lunar.to_date())) print(Lunar.from_date(datetime.date(2018, 4, 15))) print('=' * 20) # if lunar does not exist, raise DateNotExist try: lunar = Lunar(2018, 2, 15, isleap=True) except DateNotExist: print(traceback.format_exc())