def special_holiday_encode(date, freq="D"): """ Verify whether the given date is a holiday or special day like 11.11 or 03.08 :param date: :param freq: :return: """ if freq == "D": day_type = chinese_calendar.get_holiday_detail(date)[1] if day_type: return day_type elif date.month == 11 and date.day == 11: return "double11" elif date.month == 3 and date.day == 8: return "female" else: return "normal" elif freq == "7D": weekdays = range(7) for day in weekdays: week_day = get_specific_weekday_by_date(date, day) day_type = chinese_calendar.get_holiday_detail(week_day)[1] if day_type: return day_type elif week_day.month == 3 and week_day.day == 8: return "female" elif week_day.month == 11 and week_day.day == 11: return "double11" continue return "normal"
def getDetailHoliday(date): april_last = datetime.strptime(str(date), '%Y%m%d') on_holiday, holiday_name = calendar.get_holiday_detail(april_last) if (on_holiday == True and holiday_name is not None): return 1 else: return 0
def __init__(self, w_date): # w_date_f = datetime.datetime.strptime(w_date, '%Y-%m-%d %H:%M') # self.w_res = chinese_calendar.is_workday(w_date_f) w_date_f = CalDatetime(w_date).dt_all() self.w_res = chinese_calendar.is_workday(w_date_f) on_holiday, holiday_name = chinese_calendar.get_holiday_detail( w_date_f)
def __init__(self, w_date): # w_date_f = datetime.datetime.strptime(w_date, '%Y-%m-%d %H:%M') # self.w_res = chinese_calendar.is_workday(w_date_f) self.w_res = chinese_calendar.is_workday(w_date) on_holiday, holiday_name = chinese_calendar.get_holiday_detail(w_date) print("is work day?", self.w_res) print("is holiday?", on_holiday) print("holiday name?", holiday_name)
def test_detail(self): cases = [ ((2018, 2, 10), (True, None)), ((2018, 2, 11), (False, Holiday.spring_festival.value)), ((2018, 2, 12), (False, None)), ((2018, 2, 15), (True, Holiday.spring_festival.value)), ] for date, expected_result in cases: self.assertEqual(expected_result, get_holiday_detail(datetime.date(*date)))
def is_festival(date): """ 判断是否为节日 注意:有些时间属于相关节日的调休日也会显示出节日名称,可参考源码https://pypi.org/project/chinesecalendar/ """ Y = date.year M = date.month D = date.day april_last = datetime.date(Y, M, D) on_holiday, holiday_name = calendar.get_holiday_detail(april_last) return on_holiday, holiday_name
def is_workday(self): # april_last = datetime.date(2020, 10, 1) str_p = '2020-06-20 09:40' april_last = datetime.datetime.strptime(str_p, '%Y-%m-%d %H:%M') print(april_last) result = chinese_calendar.is_workday(april_last) on_holiday, holiday_name = chinese_calendar.get_holiday_detail( april_last) print("is work day?", result) print("is holiday?", on_holiday) print("holiday name?", holiday_name)
def test_same_code_as_readme(self): import datetime # Check if 2018-04-30 is holiday in China from chinese_calendar import is_workday, is_holiday april_last = datetime.date(2018, 4, 30) self.assertFalse(is_workday(april_last)) self.assertTrue(is_holiday(april_last)) # or check and get the holiday name import chinese_calendar as calendar # with different import style on_holiday, holiday_name = calendar.get_holiday_detail(april_last) self.assertTrue(on_holiday) self.assertEqual(calendar.Holiday.labour_day.value, holiday_name)
def test_same_code_as_readme_english(self): import datetime # Check if 2018-04-30 is holiday in China from chinese_calendar import is_holiday, is_workday april_last = datetime.date(2018, 4, 30) assert is_workday(april_last) is False assert is_holiday(april_last) is True # or check and get the holiday name import chinese_calendar as calendar # 也可以这样 import on_holiday, holiday_name = calendar.get_holiday_detail(april_last) assert on_holiday is True assert holiday_name == calendar.Holiday.labour_day.value # even check if a holiday is in lieu import chinese_calendar assert chinese_calendar.is_in_lieu(datetime.date(2006, 2, 1)) is False assert chinese_calendar.is_in_lieu(datetime.date(2006, 2, 2)) is True
def test_same_code_as_readme_chinese(self): import datetime # 判断 2018年4月30号 是不是节假日 from chinese_calendar import is_holiday, is_workday april_last = datetime.date(2018, 4, 30) assert is_workday(april_last) is False assert is_holiday(april_last) is True # 或者在判断的同时,获取节日名 import chinese_calendar as calendar # 也可以这样 import on_holiday, holiday_name = calendar.get_holiday_detail(april_last) assert on_holiday is True assert holiday_name == calendar.Holiday.labour_day.value # 还能判断法定节假日是不是调休 import chinese_calendar assert chinese_calendar.is_in_lieu(datetime.date(2006, 2, 1)) is False assert chinese_calendar.is_in_lieu(datetime.date(2006, 2, 2)) is True
def _get_holidays(x): is_holiday, holiday_name = calendar.get_holiday_detail(x) if holiday_name in select_holidays and is_holiday: return holiday_name
:param year: which year :param include_weekends: False for excluding Saturdays and Sundays :return: list """ if not year: year = datetime.datetime.now().year else: year = year start = datetime.date(year, 1, 1) end = datetime.date(year, 12, 31) holidays = chinese_calendar.get_holidays(start, end, include_weekends) return holidays b = get_holidays(2022, False) days = {} for i in b: on_holiday, english_name = chinese_calendar.get_holiday_detail(i) holiday_name = chinese_calendar.Holiday(english_name).chinese # 劳动节 # print(i,on_holiday,holiday_name) if holiday_name not in days: days[holiday_name] = i print("你好,摸鱼人,工作再累,一定不要忘记摸鱼哦 ! 有事没事起身去茶水间去廊道去天台走走,别老在工位上坐着。多喝点水,钱是老板的,但命是自己的!\n") for i in days: b = get_countDay(days[i], i) if b: print(b) os.system("pause")
def query_h(): today = datetime.now() on_holiday, holiday_name = calendar.get_holiday_detail(today) return on_holiday, holiday_name
import datetime # 判断 2018年4月30号 是不是节假日 from chinese_calendar import is_workday, is_holiday april_last = datetime.date(2018, 4, 30) print(april_last) # 或者在判断的同时,获取节日名 import chinese_calendar as calendar # 也可以这样 import on_holiday, holiday_name = calendar.get_holiday_detail(april_last) print(on_holiday) print(holiday_name) # 还能判断法定节假日是不是调休 import chinese_calendar print(chinese_calendar.is_in_lieu(datetime.date(2006, 1, 1))) print(chinese_calendar.is_in_lieu(datetime.date(2006, 1, 2))) # python -m test.test_workdays
def overtime(worktimes): data = {} for name in worktimes: for worktime in worktimes[name]: start = dateutil.parser.parse( worktime['start']) if worktime['start'] else None end = dateutil.parser.parse( worktime['end']) if worktime['end'] else None today = dateutil.parser.parse(worktime['day']) yesterday = today - datetime.timedelta(1) tommorrow = today + datetime.timedelta(1) # print(start, end ,today,yesterday,tommorrow,work_start_time(today),work_end_time(today)) workday = chinese_calendar.is_workday(start) lieu = chinese_calendar.is_in_lieu(start) holiday, holiday_name = chinese_calendar.get_holiday_detail(start) holiday_name = WEEKDAY[ start.weekday()] if not holiday_name else holiday_name # if not workday: # holiday, holiday_name = chinese_calendar.get_holiday_detail(o.start) # if holiday_name: # o.holiday_name = holiday_name if name not in data: data[name] = {'overtime': []} w = data[name]['overtime'] overtime = None if workday: # 如果首次提交时间小于上班时间,则认为是昨天的通宵加班 if start is not None and start < work_start_time(today): overtime = OverTime(yesterday, name) overtime.start = work_end_time(today) overtime.end = start # 如果最后一次提交大于下班时间,且没有到0点 if end is not None and end > work_end_time( today) and end < tommorrow: overtime = OverTime(today, name) overtime.start = work_end_time(today) overtime.end = end else: if start is not None and start > work_start_time(today): overtime = OverTime(today, name) overtime.start = work_start_time(today) if end is None: overtime.end = work_end_time(today) else: overtime.end = end if end > work_end_time( today) else work_end_time(today) if overtime is None: continue overtime.duration = math.ceil( (overtime.end - overtime.start).seconds / 3600.0) overtime.workday = workday overtime.holiday = holiday overtime.holiday_name = holiday_name overtime.lieu = lieu w.append(overtime) return data