# ===== CodeLab: Python 日期与时间处理 =====
# 来源: https://aoerliang.dpdns.org/articles/python-datetime
# 以下代码片段按文章出现顺序拼接, 共 5 段

# ----- 片段 1 (python) -----
from datetime import date, datetime, timedelta

today = date.today()          # 2026-07-06
now = datetime.now()          # 2026-07-06 10:30:00.123456
print(today.year, today.month, today.day)
print(now.strftime("%Y-%m-%d %H:%M"))

# ----- 片段 2 (python) -----
from datetime import datetime

# 格式化:日期对象 → 字符串
now = datetime.now()
print(now.strftime("%Y/%m/%d %H:%M"))   # 2026/07/06 10:30

# 解析:字符串 → 日期对象
s = "2026-07-06 10:30:00"
dt = datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
print(dt.weekday())  # 0 表示周一

# ----- 片段 3 (python) -----
from datetime import datetime, timedelta

deadline = datetime(2026, 8, 1, 18, 0)
now = datetime.now()
left = deadline - now                    # timedelta
print(left.days, "天", left.seconds // 3600, "小时")

print(now + timedelta(days=7))           # 一周后
print(now - timedelta(hours=2))          # 两小时前

# ----- 片段 4 (python) -----
from datetime import datetime
from zoneinfo import ZoneInfo

bj = datetime.now(ZoneInfo("Asia/Shanghai"))
ny = bj.astimezone(ZoneInfo("America/New_York"))
print(bj, ny, sep="\n")

# ----- 片段 5 (python) -----
from datetime import date, timedelta

def workdays(start: date, end: date) -> int:
    days = 0
    cur = start
    while cur <= end:
        if cur.weekday() < 5:      # 周一到周五
            days += 1
        cur += timedelta(days=1)
    return days

print(workdays(date(2026, 7, 1), date(2026, 7, 31)))  # 23
