Python生成中国节假日工作表,快速给数据库内生成工作日历

2024-08-11 21:13:16 浏览数 (2)

有时候,我们处理一些业务,比如:计算员工请假的时间工作日;就需要数据库内存在一张工作日历,记录调休和节假日。

嘿嘿嘿嘿

实际上,是有很多的公共接口。但是很多情况下,我们需要在内网环境下使用,这个时候就需要在数据库内生成工作日历表,如果使用频繁,甚至考虑缓存到中间件Redis内。

那么,如何在数据库内生成一个工作日历表呢?

离线日历库

如果只是简单的日历,那么其实系统自带的日历功能,也足够我们使用;比如iOS自带的日历,可以轻松滑动到300年后:

也不知道300年后,我在哪(╯`□′)╯也不知道300年后,我在哪(╯`□′)╯

关键我们需要的是完整的放假表,例如: 2024年的9月14日,因为中秋节调休,周六要上班。所以,我们肯定需要一个工作日历的数据来源。

万恶的调休……万恶的调休……

对于中国的节假日,最准确的肯定是中国政府网每年下半年发布次年的节假日和调休表(每次都是第一时间关注又要调休几次、最多要连续上几天的班╳╳○○),比如: 2024年的放假安排

如何获取一个离线的日历库呢?推荐以下几个项目:

  • 中国节假日、调休日、工作日、24节气查询,农历阳历互转,支持 TS、CommonJS、UMD 模块化使用: https://github.com/vsme/chinese-days
  • 判断一天是不是法定节假日/法定工作日(查看节假日安排): https://github.com/LKI/chinese-calendar

项目vsme/chinese-days是有提供调休的JSON文件的:chinese-days.json,内部主要用两个部分:

  • holidays: 放假的日期;
  • workdays: 因节日而调休的日期。

理论上,你可以直接解析这个JSON文件,或者直接使用项目封装好的功能:

代码语言:js复制
<script src="https://cdn.jsdelivr.net/npm/chinese-days/dist/index.min.js"></script>
<script>
  // 检查某个日期是否为工作日
  console.log(isWorkday('2023-01-01')); // false
  // isHoliday 检查某个日期是否为节假日
  console.log(isHoliday('2023-01-01')); // true
  //  检查某个日期是否为调休日(in lieu day)
  //    检查 2024-05-02 返回 `true` 则表示是一个调休日。
  console.log(isInLieu('2024-05-02')); // true
  //    检查 2024-05-01 返回 `false` 则表示不是一个调休日。
  console.log(isInLieu('2024-05-01')); // false
</script>

当然,为了可以生成SQL脚本,我们这里使用LKI/chinese-calendar库,接下来我们就来演示。

ChineseCalendar

项目概要项目概要

LKI/chinese-calendar是基于Python的一个日期项目,如果你观察源码,你会发现日期数据是使用枚举类和Python字典存储的:

  • constants.py: https://github.com/LKI/chinese-calendar/blob/master/chinese_calendar/constants.py

甚至结构和vsme/chinese-days也是一样的;其实vsme/chinese-days的JSON数据就是基于LKI/chinese-calendar的。在vsme/chinese-days的项目简介内,就有提及。

两个项目,都是基于MIT协议,在团队和企业内也可以放心使用。

MIT协议MIT协议

比较有趣的是节日的中英名字映射、放假天数,LKI/chinese-calendar使用的是枚举类:

代码语言:Python复制
class Holiday(Enum):
    def __new__(cls, english, chinese, days):
        obj = object.__new__(cls)
        obj._value_ = english

        obj.chinese = chinese
        obj.days = days
        return obj

    new_years_day = "New Year's Day", "元旦", 1
    spring_festival = "Spring Festival", "春节", 3
    tomb_sweeping_day = "Tomb-sweeping Day", "清明", 1
    labour_day = "Labour Day", "劳动节", 1
    dragon_boat_festival = "Dragon Boat Festival", "端午", 1
    national_day = "National Day", "国庆节", 3
    mid_autumn_festival = "Mid-autumn Festival", "中秋", 1

    # special holidays
    anti_fascist_70th_day = "Anti-Fascist 70th Day", "中国人民抗日战争暨世界反法西斯战争胜利70周年纪念日", 1

倒不是使用枚举类有多么让人意想不到,只是发现原来放假的节日这么少

0 人点赞