zoukankan      html  css  js  c++  java
  • python获取两个日期间的工作日

    import datetime
    # 计算两个日期之间的工作日数,非天数.
    class workDays():
        def __init__(self, start_date, end_date, days_off=None):
            """days_off:休息日,默认周六日, 以0(星期一)开始,到6(星期天)结束, 传入tupple
            没有包含法定节假日,
            """
            self.start_date = start_date
            self.end_date = end_date
            self.days_off = days_off
            if self.start_date > self.end_date:
                self.start_date,self.end_date = self.end_date, self.start_date
            if days_off is None:
                self.days_off = 5,6
            # 每周工作日列表
            self.days_work = [x for x in range(7) if x not in self.days_off]
    
        def workDays(self):
            """实现工作日的 iter, 从start_date 到 end_date , 如果在工作日内,yield 日期
            """
            # 还没排除法定节假日
            tag_date = self.start_date
            while True:
                if tag_date > self.end_date:
                    break
                if tag_date.weekday() in self.days_work:
                    yield tag_date
                tag_date += datetime.timedelta(days=1)
    
        def daysCount(self):
            """工作日统计,返回数字"""
            return len(list(self.workDays()))
    
        def weeksCount(self, day_start=0):
            """统计所有跨越的周数,返回数字
            默认周从星期一开始计算
            """
            day_nextweek = self.start_date
            while True:
                if day_nextweek.weekday() == day_start:
                    break
                day_nextweek += datetime.timedelta(days=1)
            # 区间在一周内
            if day_nextweek > self.end_date:
                return 1
            weeks = ((self.end_date - day_nextweek).days + 1)/7
            weeks = int(weeks)
            if ((self.end_date - day_nextweek).days + 1)%7:
                weeks += 1
            if self.start_date < day_nextweek:
                weeks += 1
            return weeks

    获取结果:

    import datetime
    startdate = datetime.datetime(2018,1,11,20,20,20)
    enddate = datetime.datetime(2019,1,11,20,20,20)
    work = workDays(startdate,enddate)  # 需要传入两个datetime格式日期
    print(list(work.workDays()))  # 获取一个元素为datetime日期格式的工作日期列表
    print(work.daysCount())  # 获取工作日期的天数
    print(work.weeksCount())  # 获取非工作日的天数
    for i in work.workDays():  # 获取每一个工作日期
        print(i)
    print(dir(work))  # 获取work的所有方法
  • 相关阅读:
    Java Web Start应用管理
    搭建java开发环境需要什么软件,怎么搭建java开发环境?
    制作WinPE
    今天看见.do网页,疑惑,这是什么文件??又是什么新技术??查了一下
    VC用ADO访问数据库全攻略
    ASP连接11种数据库语法总结
    asp.net里导出excel表方法汇总
    ASP.NET 发邮件方法
    ASP.NET 网站开发日常异常总汇(持续更新)
    javascript操作JSON
  • 原文地址:https://www.cnblogs.com/aaronthon/p/10311204.html
Copyright © 2011-2022 走看看