# Python日期时间处理:datetime、time、calendar一篇搞懂

日期时间处理是编程中的常见需求,但很多人在Python中处理日期时间时总是遇到各种问题。本文详细介绍Python中日期时间的处理方法,包括日期计算、格式化、时区转换、定时任务等,让你的日期时间处理变得简单。

# 一、基础日期时间

# 获取当前时间

from datetime import datetime, date, timedelta
import time

# 获取当前日期时间
now = datetime.now()
print(f"当前时间: {now}")
print(f"当前日期: {now.date()}")
print(f"当前时间: {now.time()}")

# 获取时间戳
timestamp = time.time()
print(f"时间戳: {timestamp}")

# 从时间戳创建datetime
dt_from_timestamp = datetime.fromtimestamp(timestamp)
print(f"从时间戳转换: {dt_from_timestamp}")

# 获取今天的日期
today = date.today()
print(f"今天是: {today}")

# 日期时间组件

from datetime import datetime

now = datetime.now()

print(f"年: {now.year}")
print(f"月: {now.month}")
print(f"日: {now.day}")
print(f"时: {now.hour}")
print(f"分: {now.minute}")
print(f"秒: {now.second}")
print(f"微秒: {now.microsecond}")
print(f"星期几(0-6): {now.weekday()}")  # 0=周一, 6=周日
print(f"星期几(1-7): {now.isoweekday()}")  # 1=周一, 7=周日

# 二、日期时间格式化

# 常用格式化

from datetime import datetime

now = datetime.now()

# 常用格式
print(now.strftime("%Y-%m-%d"))           # 2024-01-15
print(now.strftime("%Y/%m/%d"))           # 2024/01/15
print(now.strftime("%Y%m%d"))             # 20240115
print(now.strftime("%H:%M:%S"))           # 14:30:45
print(now.strftime("%Y-%m-%d %H:%M:%S"))  # 2024-01-15 14:30:45
print(now.strftime("%Y年%m月%d日"))        # 2024年01月15日
print(now.strftime("%B %d, %Y"))          # January 15, 2024
print(now.strftime("%b %d, %Y"))          # Jan 15, 2024

# 完整格式符号表
format_codes = """
%Y - 四位年份 (2024)
%y - 两位年份 (24)
%m - 月份 (01-12)
%d - 日期 (01-31)
%H - 小时24制 (00-23)
%I - 小时12制 (01-12)
%M - 分钟 (00-59)
%S - 秒 (00-59)
%f - 微秒 (000000-999999)
%a - 星期英文缩写 (Mon)
%A - 星期英文全称 (Monday)
%b - 月份英文缩写 (Jan)
%B - 月份英文全称 (January)
%w - 星期数字 (0=周日)
%j - 一年中的第几天 (001-366)
%U - 一年中的第几周 (周日开始)
%W - 一年中的第几周 (周一开始)
"""
print(format_codes)

# 字符串转日期

from datetime import datetime

# 字符串转datetime
date_str = "2024-01-15 14:30:45"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(f"解析结果: {dt}")

# 自动检测格式
from dateutil import parser
dt_auto = parser.parse("2024年1月15日")
print(f"自动解析: {dt_auto}")

dt_auto2 = parser.parse("Jan 15, 2024")
print(f"自动解析2: {dt_auto2}")

# 三、日期时间计算

# 时间加减

from datetime import datetime, timedelta

now = datetime.now()
print(f"现在: {now}")

# 加减天数
tomorrow = now + timedelta(days=1)
print(f"明天: {tomorrow}")

yesterday = now - timedelta(days=1)
print(f"昨天: {yesterday}")

# 加减小时
two_hours_later = now + timedelta(hours=2)
print(f"2小时后: {two_hours_later}")

# 加减分钟
thirty_minutes_ago = now - timedelta(minutes=30)
print(f"30分钟前: {thirty_minutes_ago}")

# 组合加减
next_week = now + timedelta(weeks=1, days=2, hours=3)
print(f"1周2天3小时后: {next_week}")

# 计算日期间隔

from datetime import datetime

date1 = datetime(2024, 1, 1)
date2 = datetime(2024, 12, 31)

# 计算间隔
delta = date2 - date1
print(f"间隔天数: {delta.days}")
print(f"间隔秒数: {delta.total_seconds()}")
print(f"间隔小时: {delta.total_seconds() / 3600}")

# 判断日期早晚
if date1 < date2:
    print("date1 早于 date2")

# 计算工作日

from datetime import datetime, timedelta

def add_workdays(start_date, days):
    """计算若干工作日后的日期(跳过周末)"""
    current = start_date
    days_added = 0
    
    while days_added < days:
        current += timedelta(days=1)
        # 0=周一, 5=周六, 6=周日
        if current.weekday() < 5:
            days_added += 1
    
    return current

# 使用
start = datetime(2024, 1, 1)  # 周一
result = add_workdays(start, 10)  # 10个工作日后
print(f"从1月1日加10个工作日: {result.strftime('%Y-%m-%d %A')}")

# 计算两个日期之间的工作日
from datetime import datetime

def count_workdays(start, end):
    """计算两个日期之间的工作日数量"""
    days = 0
    current = start
    
    while current <= end:
        if current.weekday() < 5:  # 周一到周五
            days += 1
        current += timedelta(days=1)
    
    return days

start = datetime(2024, 1, 1)
end = datetime(2024, 1, 31)
workdays = count_workdays(start, end)
print(f"2024年1月工作日: {workdays}天")

# 四、时区处理

# 时区转换

from datetime import datetime, timezone, timedelta

# 创建带时区的datetime
utc_time = datetime.now(timezone.utc)
print(f"UTC时间: {utc_time}")

# 东八区时间(中国)
china_tz = timezone(timedelta(hours=8))
china_time = utc_time.astimezone(china_tz)
print(f"中国时间: {china_time}")

# 其他时区
japan_tz = timezone(timedelta(hours=9))
japan_time = utc_time.astimezone(japan_tz)
print(f"日本时间: {japan_time}")

# 时间戳与datetime互转
import time

# datetime转时间戳
now = datetime.now()
timestamp = now.timestamp()
print(f"当前时间戳: {timestamp}")

# 时间戳转datetime
dt = datetime.fromtimestamp(timestamp)
print(f"时间戳转datetime: {dt}")

# pytz时区库

pip install pytz
import pytz
from datetime import datetime

# 获取所有时区
print("常用时区:", pytz.all_timezones[:10])

# 使用指定时区
tokyo = pytz.timezone('Asia/Tokyo')
china = pytz.timezone('Asia/Shanghai')
ny = pytz.timezone('America/New_York')

# 本地时间转指定时区
local_time = datetime.now()
print(f"本地时间: {local_time}")

tokyo_time = local_time.astimezone(tokyo)
print(f"东京时间: {tokyo_time}")

china_time = local_time.astimezone(china)
print(f"北京时间: {china_time}")

# 从字符串创建时区时间
china_tz = pytz.timezone('Asia/Shanghai')
china_time = china_tz.localize(datetime(2024, 1, 15, 10, 0, 0))
print(f"北京时间: {china_time}")

# 转换为其他时区
ny_time = china_time.astimezone(ny)
print(f"纽约时间: {ny_time}")

# 五、日期时间工具函数

from datetime import datetime, timedelta
import calendar

# 获取日期范围
def date_range(start_date, end_date):
    """生成日期范围内的所有日期"""
    dates = []
    current = start_date
    while current <= end_date:
        dates.append(current)
        current += timedelta(days=1)
    return dates

# 使用
from datetime import datetime
dates = date_range(datetime(2024, 1, 1), datetime(2024, 1, 10))
for d in dates:
    print(d.strftime("%Y-%m-%d"))

# 获取月份的第一天和最后一天
def get_month_bounds(year, month):
    """获取月份的第一天和最后一天"""
    first_day = datetime(year, month, 1)
    last_day = datetime(year, month, calendar.monthrange(year, month)[1])
    return first_day, last_day

first, last = get_month_bounds(2024, 2)
print(f"2024年2月: {first.strftime('%Y-%m-%d')}{last.strftime('%Y-%m-%d')}")

# 判断是否是闰年
print(f"2024是闰年: {calendar.isleap(2024)}")
print(f"2025是闰年: {calendar.isleap(2025)}")

# 获取某月的天数
print(f"2024年2月有: {calendar.monthrange(2024, 2)[1]} 天")

# 判断是否是周末
def is_weekend(d):
    return d.weekday() >= 5

print(f"2024-01-01是周末: {is_weekend(datetime(2024, 1, 1))}")
print(f"2024-01-06是周末: {is_weekend(datetime(2024, 1, 6))}")

# 六、定时任务

# schedule库

pip install schedule
import schedule
import time

def job():
    print("任务执行中...")

# 定时任务示例
schedule.every(10).seconds.do(job)        # 每10秒
schedule.every(10).minutes.do(job)        # 每10分钟
schedule.every().hour.do(job)             # 每小时
schedule.every().day.at("10:30").do(job)  # 每天10:30
schedule.every().monday.do(job)            # 每周一
schedule.every().wednesday.at("13:15").do(job)  # 每周三13:15

# 运行调度器
print("定时任务已启动,按Ctrl+C退出")
while True:
    schedule.run_pending()
    time.sleep(1)

# 相关资源

# 总结

Python的datetime模块功能强大,掌握日期格式化、计算、时区处理、定时任务等核心技能,让你的日期时间处理变得简单高效!

Last Updated: 4/23/2026, 9:22:28 AM