# 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-office 官方文档 - Python自动化办公库
- AI + 自动化办公课程 - 35讲AI办公自动化实战
- Python 实用技巧 - 更多Python技巧
- 📺 视频课程:自动化办公50讲
- 📧 技术交流:联系程序员晚枫
# 总结
Python的datetime模块功能强大,掌握日期格式化、计算、时区处理、定时任务等核心技能,让你的日期时间处理变得简单高效!