Skip to content

单双周计算


public-time:2020-10-21 12:18

实在受不了单双周了,写了个推算程序想往后推几周就推几周
例:
2020年10月19日——2020年10月25日:双
2020年10月26日——2020年11月 1日:单
...

# @File    : run.py
import datetime


def dayms(leapyear_):
    days = dict()
    lis = [1, 3, 5, 7, 8, 10, 12]
    for i in lis: days[i] = 31
    lis = [4, 6, 9, 11]
    for i in lis: days[i] = 30
    days[2] = 29 if leapyear_ else 28
    # return sorted(days.items(), key=lambda x: x[0])
    return days


def leapyear(year_):
    if (year_ % 4) == 0:
        if (year_ % 100) == 0:
            if (year_ % 400) == 0:
                return True  # 整百年能被400整除的是闰年
            else:
                return False  # 整百年不能被400整除的不是闰年
        else:
            return True  # 非整百年能被4整除的为闰年
    else:
        return False  # 不能被4整除不是闰年


def mr(year_, month_, yearDic_):
    if 1 <= month_ <= 12:
        pass
    else:
        year_ += 1 if month_ > 12 else -1
        month_ = 1 if month_ > 12 else 12
        # 如果传值为13月(误)。则应该是一月
        # 如果传值是0月,则只能由1月-1得到,为此应该是12月
        yearDic_ = dayms(leapyear(year_))
    # 从新计算是否是闰年
    return year_, month_, yearDic_


def dr(year_, month_, day_, yearDic_):
    if yearDic_[month_] < day_:
        day_ -= yearDic_[month_]
        year_, month_, yearDic_ = mr(year_, month_ + 1, yearDic_)
    if day_ < 0:
        year_, month_, yearDic_ = mr(year_, month_ - 1, yearDic_)
        day_ += yearDic_[month_]
    return year_, month_, day_, yearDic_


def ouy(yearDic_, year_, month_, day_, ds_, dayOfWeek):
    k = int(input("往后推多少周:"))
    year_, month_, day_, yearDic_ = dr(year_, month_, day_ - dayOfWeek, yearDic_)
    for i in range(k):
        year1, month1, day1, yearDic_ = \
            dr(year_, month_, day_ + 1, yearDic_)  # 下一周结束日
        year_, month_, day_, yearDic_ = \
            dr(year_, month_, day_ + 7, yearDic_)  # 下一周起始日
        print("{:4d}{:2d}{:2d}日——{:4d}{:2d}{:2d}日:{}" \
              .format(year1, month1, day1, \
                      year_, month_, day_, \
                      ds_[i % 2]))


if __name__ == '__main__':
    sl = input("以当前时间开始推算输入y,自定义时间输入s:")
    s, dayOfWeek = 's', 0
    if sl == 'y':
        s = datetime.datetime.now().strftime('%Y-%m-%d')  # 当前日期
    elif sl == 's':
        s = input("输入日期(y-m-d):")
    year, month, day = s.split('-')  # 分割字符串提取日期
    ntime = datetime.datetime(int(year), int(month), int(day))  # 当前时间
    dayOfWeek = ntime.isoweekday()
    yearDic = dayms(leapyear(int(year)))
    ds = input("当前是单周还是双周?(单和双二选一):")
    ds = ['单', '双'] if ds == '单' else ['双', '单']
    ouy(yearDic, int(year), int(month), int(day), ds, dayOfWeek)


'''
示例1输出:
以当前时间开始推算输入y,自定义时间输入s:s
输入日期(y-m-d):2020-1-3
当前是单周还是双周?(单和双二选一):双
往后推多少周:4
2019年12月30日——2020年 1月 5日:双
2020年 1月 6日——2020年 1月12日:单
2020年 1月13日——2020年 1月19日:双
2020年 1月20日——2020年 1月26日:单

示例2输出:
以当前时间开始推算输入y,自定义时间输入s:y
当前是单周还是双周?(单和双二选一):双
往后推多少周:4
2020年10月19日——2020年10月25日:双
2020年10月26日——2020年11月 1日:单
2020年11月 2日——2020年11月 8日:双
2020年11月 9日——2020年11月15日:单

'''