單雙周計算


實在受不了單雙周了,寫了個推算程序想往后推幾周就推幾周
例:
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日:單

'''


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM