文章目录
- 使用strftime()方法可以将日期时间对象格式化为字符串: formatted = now.strftime(“%Y-%m-%d %H:%M:%S”) print(formatted) # 输出:2023-05-15 14:30:15
- 使用strptime()方法可以从字符串解析出日期时间对象: dt = datetime.strptime(“2023-05-15 14:30:15”, “%Y-%m-%d %H:%M:%S”) print(dt) # 输出:2023-05-15 14:30:15
- 代码 含义 示例 %Y 四位年份 2023 %y 两位年份 23 %m 两位月份 05 %d 两位日期 15 %H 24小时制小时 14 %I 12小时制小时 02 %M 分钟 30 %S 秒 15 %f 微秒 123456 %A 完整星期名称 Monday %a 简写星期名称 Mon %B 完整月份名称 May %b 简写月份名称 May %j 一年中的第几天 135 %U 一年中的第几周(周日为一周开始) 20 %W 一年中的第几周(周一为一周开始) 20 %w 星期几(0-6, 0是周日) 1 (周一) %Z 时区名称 CST %z UTC偏移 +0800
- timedelta表示两个日期或时间之间的间隔: delta = timedelta( days=7, # 7天 seconds=0, # 0秒 microseconds=0, milliseconds=0, minutes=0, hours=3, # 3小时 weeks=0 )
- # 加7天3小时 future = now + timedelta(days=7, hours=3) # 减2周 past = now – timedelta(weeks=2)
- diff = datetime(2023, 6, 1) – datetime(2023, 5, 1) print(diff.days) # 输出:31
- import pytz # 获取时区对象 tz_shanghai = pytz.timezone(‘Asia/Shanghai’) tz_ny = pytz.timezone(‘America/New_York’) # 本地化时间 local_time = tz_shanghai.localize(datetime(2023, 5, 15, 14, 30)) print(local_time) # 2023-05-15 14:30:00+08:00 # 转换时区 ny_time = local_time.astimezone(tz_ny) print(ny_time) # 2023-05-15 02:30:00-04:00
- from zoneinfo import ZoneInfo tz_sh = ZoneInfo(“Asia/Shanghai”) dt = datetime(2023, 5, 15, 14, 30, tzinfo=tz_sh) print(dt) # 2023-05-15 14:30:00+08:00
- 避免在循环中重复创建相同的日期时间对象 对于大量日期时间操作,考虑使用NumPy的datetime64或Pandas的Timestamp
- dt1 = datetime(2023, 5, 1) dt2 = datetime(2023, 5, 15) print(dt1 < dt2) # True print(dt1 == dt2) # False print(dt1 > dt2) # False
- # 检查闰年 print(date(2020, 1, 1).year % 4 == 0) # True # 获取某个月有多少天 import calendar print(calendar.monthrange(2023, 2)[1]) # 28
- # 计算下个工作日 def next_workday(d): while True: d += timedelta(days=1) if d.weekday() < 5: # 0-4是周一到周五 return d print(next_workday(date(2023, 5, 12))) # 2023-05-15 (跳过周末)
- 问题:如何在不同时区之间正确转换时间? 解决方案: from datetime import datetime import pytz # 创建带时区的时间 utc_time = datetime.now(pytz.utc) print(utc_time) # 2023-05-15 06:30:15+00:00 # 转换为上海时间 shanghai_time = utc_time.astimezone(pytz.timezone(‘Asia/Shanghai’)) print(shanghai_time) # 2023-05-15 14:30:15+08:00
- 问题:不同来源的日期字符串格式不一致怎么办? 解决方案:使用dateutil解析器 from dateutil import parser dates = [ “2023-05-15”, “15/05/2023”, “May 15, 2023”, “15 May 2023” ] for d in dates: print(parser.parse(d)) # 全部解析为datetime对象
- 问题:处理大量日期时间数据时性能低下 解决方案:使用Pandas import pandas as pd # 创建日期范围 date_range = pd.date_range(‘2023-01-01’, ‘2023-12-31′, freq=’D’) # 高效操作 print(date_range[date_range.weekday < 5]) # 所有工作日
目录
- 一、datetime模块概述
- 二、获取当前日期和时间
- 1. 获取当前日期和时间
- 2. 获取当前日期
- 3. 获取当前时间
- 三、创建特定日期和时间对象
- 1. 创建日期对象
- 2. 创建时间对象
- 3. 创建日期时间对象
- 四、日期时间格式化与解析
- 1. 格式化日期时间为字符串
- 2. 从字符串解析日期时间
- 3. 常用格式化代码
- 五、日期时间运算
- 1. 时间差(timedelta)的使用
- 2. 日期时间加减
- 3. 计算两个日期/时间的差
- 六、访问日期时间属性
- 七、时区处理
- 1. 使用pytz处理时区
- 2. Python 3.9+使用zoneinfo
- 八、实用技巧和最佳实践
- 1. 性能考虑
- 2. 日期时间比较
- 3. 处理闰年和闰秒
- 4. 工作日计算
- 九、常见问题解决方案
- 1. 时区转换问题
- 2. 日期字符串解析不一致
- 3. 性能优化
- 总结
日期和时间处理是编程中最常见的任务之一,无论是记录日志、分析时间序列数据,还是安排任务,都需要精确的时间管理。Python内置的
datetime模块提供了强大的工具来处理这些需求。本文将全面介绍datetime模块的使用方法,从基础操作到高级技巧,帮助你掌握Python中的日期时间处理。

Python的datetime模块是标准库中用于处理日期和时间的核心模块,它提供了多个类来表示和操作日期、时间以及它们的组合。
主要类介绍
- datetime.date:处理日期(年、月、日)
- datetime.time:处理时间(时、分、秒、微秒)
- datetime.datetime:处理日期和时间的组合
- datetime.timedelta:表示两个日期或时间之间的间隔
- datetime.tzinfo:时区信息抽象基类(需要子类化使用)
from datetime import date, time, datetime, timedelta
now = datetime.now() # 返回当前本地日期和时间
print(now) # 输出:2023-05-15 14:30:15.123456
today = date.today()
print(today) # 输出:2023-05-15
current_time = datetime.now().time()
print(current_time) # 输出:14:30:15.123456
d = date(2023, 5, 15) # 年, 月, 日
print(d) # 输出:2023-05-15
t = time(14, 30, 15) # 时, 分, 秒
print(t) # 输出:14:30:15
dt = datetime(2023, 5, 15, 14, 30, 15)
print(dt) # 输出:2023-05-15 14:30:15
使用strftime()方法可以将日期时间对象格式化为字符串:
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted) # 输出:2023-05-15 14:30:15
使用strptime()方法可以从字符串解析出日期时间对象:
dt = datetime.strptime("2023-05-15 14:30:15", "%Y-%m-%d %H:%M:%S")
print(dt) # 输出:2023-05-15 14:30:15
| 代码 | 含义 | 示例 |
|---|---|---|
| %Y | 四位年份 | 2023 |
| %y | 两位年份 | 23 |
| %m | 两位月份 | 05 |
| %d | 两位日期 | 15 |
| %H | 24小时制小时 | 14 |
| %I | 12小时制小时 | 02 |
| %M | 分钟 | 30 |
| %S | 秒 | 15 |
| %f | 微秒 | 123456 |
| %A | 完整星期名称 | Monday |
| %a | 简写星期名称 | Mon |
| %B | 完整月份名称 | May |
| %b | 简写月份名称 | May |
| %j | 一年中的第几天 | 135 |
| %U | 一年中的第几周(周日为一周开始) | 20 |
| %W | 一年中的第几周(周一为一周开始) | 20 |
| %w | 星期几(0-6, 0是周日) | 1 (周一) |
| %Z | 时区名称 | CST |
| %z | UTC偏移 | +0800 |
timedelta表示两个日期或时间之间的间隔:
delta = timedelta(
days=7, # 7天
seconds=0, # 0秒
microseconds=0,
milliseconds=0,
minutes=0,
hours=3, # 3小时
weeks=0
)
# 加7天3小时
future = now + timedelta(days=7, hours=3)
# 减2周
past = now - timedelta(weeks=2)
diff = datetime(2023, 6, 1) - datetime(2023, 5, 1)
print(diff.days) # 输出:31
# 访问datetime对象的各个部分
print(f"Year: {now.year}") # 年
print(f"Month: {now.month}") # 月
print(f"Day: {now.day}") # 日
print(f"Hour: {now.hour}") # 时
print(f"Minute: {now.minute}") # 分
print(f"Second: {now.second}") # 秒
print(f"Microsecond: {now.microsecond}") # 微秒
print(f"Weekday: {now.weekday()}") # 周一为0,周日为6
print(f"ISO Weekday: {now.isoweekday()}") # 周一为1,周日为7
Python的datetime模块本身对时区的支持有限,通常需要结合第三方库如pytz或Python 3.9+的zoneinfo模块使用。
import pytz
# 获取时区对象
tz_shanghai = pytz.timezone('Asia/Shanghai')
tz_ny = pytz.timezone('America/New_York')
# 本地化时间
local_time = tz_shanghai.localize(datetime(2023, 5, 15, 14, 30))
print(local_time) # 2023-05-15 14:30:00+08:00
# 转换时区
ny_time = local_time.astimezone(tz_ny)
print(ny_time) # 2023-05-15 02:30:00-04:00
from zoneinfo import ZoneInfo
tz_sh = ZoneInfo("Asia/Shanghai")
dt = datetime(2023, 5, 15, 14, 30, tzinfo=tz_sh)
print(dt) # 2023-05-15 14:30:00+08:00
- 避免在循环中重复创建相同的日期时间对象
- 对于大量日期时间操作,考虑使用NumPy的datetime64或Pandas的Timestamp
dt1 = datetime(2023, 5, 1)
dt2 = datetime(2023, 5, 15)
print(dt1 < dt2) # True
print(dt1 == dt2) # False
print(dt1 > dt2) # False
# 检查闰年
print(date(2020, 1, 1).year % 4 == 0) # True
# 获取某个月有多少天
import calendar
print(calendar.monthrange(2023, 2)[1]) # 28
# 计算下个工作日
def next_workday(d):
while True:
d += timedelta(days=1)
if d.weekday() < 5: # 0-4是周一到周五
return d
print(next_workday(date(2023, 5, 12))) # 2023-05-15 (跳过周末)
问题:如何在不同时区之间正确转换时间?
解决方案:
from datetime import datetime
import pytz
# 创建带时区的时间
utc_time = datetime.now(pytz.utc)
print(utc_time) # 2023-05-15 06:30:15+00:00
# 转换为上海时间
shanghai_time = utc_time.astimezone(pytz.timezone('Asia/Shanghai'))
print(shanghai_time) # 2023-05-15 14:30:15+08:00
问题:不同来源的日期字符串格式不一致怎么办?
解决方案:使用dateutil解析器
from dateutil import parser
dates = [
"2023-05-15",
"15/05/2023",
"May 15, 2023",
"15 May 2023"
]
for d in dates:
print(parser.parse(d)) # 全部解析为datetime对象
问题:处理大量日期时间数据时性能低下
解决方案:使用Pandas
import pandas as pd
# 创建日期范围
date_range = pd.date_range('2023-01-01', '2023-12-31', freq='D')
# 高效操作
print(date_range[date_range.weekday < 5]) # 所有工作日
Python的datetime模块提供了强大而灵活的工具来处理日期和时间。通过本文的介绍,你应该已经掌握了:
- 如何创建和获取日期时间对象
- 日期时间的格式化和解析
- 日期时间的计算和比较
- 时区处理的基本方法
- 一些实用技巧和最佳实践
记住,处理日期和时间时要特别注意时区和地区差异,对于复杂的时区操作,建议使用pytz或Python 3.9+的zoneinfo模块。对于大规模时间序列数据处理,Pandas和NumPy提供了更高效的解决方案。
掌握这些技能后,你将能够轻松应对大多数与日期时间相关的编程任务,从简单的日志记录到复杂的时间序列分析。
到此这篇关于Python datetime模块完全指南:高效处理日期和时间的文章就介绍到这了,更多相关Python datetime日期和时间内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python之日期和时间包datetime的使用
- Python 日期和时间处理教程之datetime 模块的使用示例详解
- python使用datetime模块处理日期时间及常用功能详解
- Python日期与时间模块(datetime+time+Calendar+dateuil )相关使用讲解
- Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
- python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
- Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
- Python之日期与时间处理模块(date和datetime)