文章目录
- dt = datetime(2023, 10, 1, 15, 30, 45) # 获取年、月、日 print(dt.year) # 2023 print(dt.month) # 10 print(dt.day) # 1 # 获取时、分、秒、微秒 print(dt.hour) # 15 print(dt.minute) # 30 print(dt.second) # 45 print(dt.microsecond) # 0(手动创建时未指定,默认为0)
- 用 strftime(format) 方法将时间对象转为自定义格式的字符串(format 为格式化符号): dt = datetime(2023, 10, 1, 15, 30, 45) # 常用格式化符号 print(dt.strftime(“%Y-%m-%d”)) # 2023-10-01(年-月-日) print(dt.strftime(“%H:%M:%S”)) # 15:30:45(时:分:秒,24小时制) print(dt.strftime(“%Y年%m月%d日 %H:%M”)) # 2023年10月01日 15:30 print(dt.strftime(“%A, %B %d, %Y”)) # Sunday, October 01, 2023(星期、月份全称) 常用格式化符号表: 符号 含义 示例 %Y 4 位年份 2023 %m 2 位月份(01-12) 10 %d 2 位日期(01-31) 01 %H 24 小时制小时(00-23) 15 %I 12 小时制小时(01-12) 03 %M 2 位分钟(00-59) 30 %S 2 位秒数(00-59) 45 %a 星期缩写(如 Sun) Sun %A 星期全称(如 Sunday) Sunday %b 月份缩写(如 Oct) Oct %B 月份全称(如 October) October
- 用 strptime(date_string, format) 方法将字符串解析为时间对象(format 需与字符串格式一致): # 解析日期字符串 date_str = “2023-10-01” dt = datetime.strptime(date_str, “%Y-%m-%d”) print(dt) # 输出:2023-10-01 00:00:00(时间部分默认00:00:00) # 解析带时间的字符串 datetime_str = “2023-10-01 15:30:45” dt = datetime.strptime(datetime_str, “%Y-%m-%d %H:%M:%S”) print(dt) # 输出:2023-10-01 15:30:45 若字符串格式与 format 不匹配,会报 ValueError,需确保格式一致。
- from datetime import timedelta # 常用参数:days, seconds, minutes, hours, weeks delta1 = timedelta(days=3) # 3天 delta2 = timedelta(hours=12) # 12小时 delta3 = timedelta(weeks=1, days=2) # 1周+2天=9天
- now = datetime.now() # 计算3天后的时间 future = now + timedelta(days=3) print(f”3天后:{future.strftime(‘%Y-%m-%d’)}”) # 计算1小时30分钟前的时间 past = now – timedelta(hours=1, minutes=30) print(f”1小时30分钟前:{past.strftime(‘%H:%M’)}”) # 两个datetime对象相减,得到timedelta delta = future – now print(f”时间间隔:{delta.days}天 {delta.seconds//3600}小时”) # 3天 0小时
- date1 = date(2023, 1, 1) date2 = date(2023, 12, 31) delta = date2 – date1 print(f”2023年共有{delta.days}天”) # 输出:364(2023不是闰年)
- from datetime import datetime from zoneinfo import ZoneInfo # 需Python 3.9+ # 创建带时区的datetime对象 # 北京时间(Asia/Shanghai) beijing_time = datetime(2023, 10, 1, 8, 0, tzinfo=ZoneInfo(“Asia/Shanghai”)) # 纽约时间(America/New_York) newyork_time = datetime(2023, 10, 1, 8, 0, tzinfo=ZoneInfo(“America/New_York”)) print(f”北京时间:{beijing_time}”) # 2023-10-01 08:00:00+08:00 print(f”纽约时间:{newyork_time}”) # 2023-10-01 08:00:00-04:00 # 转换为UTC时间 utc_time = beijing_time.astimezone(ZoneInfo(“UTC”)) print(f”对应的UTC时间:{utc_time}”) # 2023-09-30 23:00:00+00:00
- # 将纽约时间转换为北京时间 beijing_from_newyork = newyork_time.astimezone(ZoneInfo(“Asia/Shanghai”)) print(f”纽约时间{newyork_time.strftime(‘%H:%M’)} 对应北京时间:{beijing_from_newyork.strftime(‘%H:%M’)}”) # 输出:纽约时间08:00 对应北京时间20:00(时差12小时)
- # 错误示例:字符串是”10/01/2023″,格式用了”%Y-%m-%d” datetime.strptime(“10/01/2023”, “%Y-%m-%d”) # ValueError # 正确:格式改为”%m/%d/%Y” datetime.strptime(“10/01/2023”, “%m/%d/%Y”) # 2023-10-01 00:00:00
- dt = datetime(2023, 10, 1) dt.year = 2024 # AttributeError: can’t set attribute # 正确:用replace() dt = dt.replace(year=2024)
- # 避免直接比较naive时间(无时区)和aware时间(有时区) naive_dt = datetime(2023, 10, 1) aware_dt = datetime(2023, 10, 1, tzinfo=ZoneInfo(“UTC”)) naive_dt == aware_dt # 报错:TypeError: can’t compare offset-naive and offset-aware datetimes
目录
- 前言
- 一、核心类:datetime 模块的 "四大金刚"
- 二、获取当前时间:datetime.now () 的妙用
- 三、时间对象的属性与转换
- 1. 访问时间属性
- 2. 转换为字符串(格式化输出)
- 3. 字符串转时间对象(解析)
- 四、时间计算:timedelta 的灵活运用
- 1. 创建 timedelta 对象
- 2. 时间加减运算
- 3. 实用场景:计算两个日期相差的天数
- 五、日期的替换与调整
- 六、时区处理(进阶)
- 1. 用 zoneinfo 处理时区(Python 3.9+)
- 2. 时区转换
- 七、常见错误与解决方案
- 错误:字符串解析格式不匹配
- 错误:datetime 对象不可直接修改
- 错误:不同时区的时间直接比较
- 总结
在 Python 中,datetime模块是处理日期和时间的核心工具,提供了简洁易用的类和方法,能轻松解决时间解析、转换、计算等常见需求。本文将系统梳理datetime模块的常用功能,从基础到进阶,让你彻底掌握时间处理技巧。
datetime模块包含四个核心类,分别处理不同粒度的时间信息:
| 类名 | 功能描述 | 示例 |
|---|---|---|
date |
处理日期(年、月、日) | date(2023, 10, 1) → 2023 年 10 月 1 日 |
time |
处理时间(时、分、秒、微秒) | time(15, 30, 45) → 15 时 30 分 45 秒 |
datetime |
处理日期 + 时间(最常用) | datetime(2023, 10, 1, 15, 30, 45) |
timedelta |
表示时间间隔(用于时间加减) | timedelta(days=3) → 3 天 |
获取当前日期和时间是最基础的操作,datetime.now() 可直接返回当前本地时间:
from datetime import datetime, date, time # 1. 获取当前日期+时间(datetime对象) now = datetime.now() print(now) # 输出:2023-10-01 15:30:45.123456 print(type(now)) # 输出:<class 'datetime.datetime'> # 2. 单独获取当前日期(date对象) today = date.today() print(today) # 输出:2023-10-01 # 3. 单独获取当前时间(time对象) current_time = datetime.now().time() print(current_time) # 输出:15:30:45.123456
datetime.now()包含年、月、日、时、分、秒、微秒;- 可通过
datetime.utcnow()获取当前 UTC 时间(世界协调时间)。
datetime、date、time 对象提供了丰富的属性,可直接获取年、月、日等信息,也能转换为字符串:
dt = datetime(2023, 10, 1, 15, 30, 45)
# 获取年、月、日
print(dt.year) # 2023
print(dt.month) # 10
print(dt.day) # 1
# 获取时、分、秒、微秒
print(dt.hour) # 15
print(dt.minute) # 30
print(dt.second) # 45
print(dt.microsecond) # 0(手动创建时未指定,默认为0)
用 strftime(format) 方法将时间对象转为自定义格式的字符串(format 为格式化符号):
dt = datetime(2023, 10, 1, 15, 30, 45)
# 常用格式化符号
print(dt.strftime("%Y-%m-%d")) # 2023-10-01(年-月-日)
print(dt.strftime("%H:%M:%S")) # 15:30:45(时:分:秒,24小时制)
print(dt.strftime("%Y年%m月%d日 %H:%M")) # 2023年10月01日 15:30
print(dt.strftime("%A, %B %d, %Y")) # Sunday, October 01, 2023(星期、月份全称)
常用格式化符号表:
| 符号 | 含义 | 示例 |
|---|---|---|
| %Y | 4 位年份 | 2023 |
| %m | 2 位月份(01-12) | 10 |
| %d | 2 位日期(01-31) | 01 |
| %H | 24 小时制小时(00-23) | 15 |
| %I | 12 小时制小时(01-12) | 03 |
| %M | 2 位分钟(00-59) | 30 |
| %S | 2 位秒数(00-59) | 45 |
| %a | 星期缩写(如 Sun) | Sun |
| %A | 星期全称(如 Sunday) | Sunday |
| %b | 月份缩写(如 Oct) | Oct |
| %B | 月份全称(如 October) | October |
用 strptime(date_string, format) 方法将字符串解析为时间对象(format 需与字符串格式一致):
# 解析日期字符串 date_str = "2023-10-01" dt = datetime.strptime(date_str, "%Y-%m-%d") print(dt) # 输出:2023-10-01 00:00:00(时间部分默认00:00:00) # 解析带时间的字符串 datetime_str = "2023-10-01 15:30:45" dt = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M:%S") print(dt) # 输出:2023-10-01 15:30:45
- 若字符串格式与
format不匹配,会报ValueError,需确保格式一致。
timedelta 表示时间间隔,可与 datetime 对象进行加减运算,实现 “多少天后 / 前的时间” 等需求:
from datetime import timedelta
# 常用参数:days, seconds, minutes, hours, weeks
delta1 = timedelta(days=3) # 3天
delta2 = timedelta(hours=12) # 12小时
delta3 = timedelta(weeks=1, days=2) # 1周+2天=9天
now = datetime.now()
# 计算3天后的时间
future = now + timedelta(days=3)
print(f"3天后:{future.strftime('%Y-%m-%d')}")
# 计算1小时30分钟前的时间
past = now - timedelta(hours=1, minutes=30)
print(f"1小时30分钟前:{past.strftime('%H:%M')}")
# 两个datetime对象相减,得到timedelta
delta = future - now
print(f"时间间隔:{delta.days}天 {delta.seconds//3600}小时") # 3天 0小时
date1 = date(2023, 1, 1)
date2 = date(2023, 12, 31)
delta = date2 - date1
print(f"2023年共有{delta.days}天") # 输出:364(2023不是闰年)
datetime 对象是不可变的,但可通过 replace() 方法创建修改后的新对象:
dt = datetime(2023, 10, 1, 15, 30) # 替换年份和月份 new_dt = dt.replace(year=2024, month=1) print(new_dt) # 2024-01-01 15:30:00 # 替换时间为0点0分 midnight = dt.replace(hour=0, minute=0, second=0, microsecond=0) print(midnight) # 2023-10-01 00:00:00
默认情况下,datetime 不包含时区信息( naive 时间),处理跨时区时间需用 pytz 库或 Python 3.9+ 的 zoneinfo 模块(推荐):
from datetime import datetime
from zoneinfo import ZoneInfo # 需Python 3.9+
# 创建带时区的datetime对象
# 北京时间(Asia/Shanghai)
beijing_time = datetime(2023, 10, 1, 8, 0, tzinfo=ZoneInfo("Asia/Shanghai"))
# 纽约时间(America/New_York)
newyork_time = datetime(2023, 10, 1, 8, 0, tzinfo=ZoneInfo("America/New_York"))
print(f"北京时间:{beijing_time}") # 2023-10-01 08:00:00+08:00
print(f"纽约时间:{newyork_time}") # 2023-10-01 08:00:00-04:00
# 转换为UTC时间
utc_time = beijing_time.astimezone(ZoneInfo("UTC"))
print(f"对应的UTC时间:{utc_time}") # 2023-09-30 23:00:00+00:00
# 将纽约时间转换为北京时间
beijing_from_newyork = newyork_time.astimezone(ZoneInfo("Asia/Shanghai"))
print(f"纽约时间{newyork_time.strftime('%H:%M')} 对应北京时间:{beijing_from_newyork.strftime('%H:%M')}")
# 输出:纽约时间08:00 对应北京时间20:00(时差12小时)
# 错误示例:字符串是"10/01/2023",格式用了"%Y-%m-%d"
datetime.strptime("10/01/2023", "%Y-%m-%d") # ValueError
# 正确:格式改为"%m/%d/%Y"
datetime.strptime("10/01/2023", "%m/%d/%Y") # 2023-10-01 00:00:00
dt = datetime(2023, 10, 1)
dt.year = 2024 # AttributeError: can't set attribute
# 正确:用replace()
dt = dt.replace(year=2024)
# 避免直接比较naive时间(无时区)和aware时间(有时区)
naive_dt = datetime(2023, 10, 1)
aware_dt = datetime(2023, 10, 1, tzinfo=ZoneInfo("UTC"))
naive_dt == aware_dt # 报错:TypeError: can't compare offset-naive and offset-aware datetimes
datetime模块是 Python 处理时间的 “瑞士军刀”,核心功能包括:
- 用
datetime.now()获取当前时间; - 用
strftime()和strptime()实现时间与字符串的转换; - 用
timedelta进行时间加减计算; - 用
replace()调整日期或时间; - 用
zoneinfo(或pytz)处理时区问题。
掌握这些方法,能轻松应对日志记录、日程计算、数据时间戳解析等常见场景。建议根据具体需求选择合适的类(datetime最常用),并注意字符串格式与时间对象的转换细节。
到此这篇关于Python datetime 模块常用功能(轻松搞定时间处理)的文章就介绍到这了,更多相关Python datetime 模块内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python时间处理模块time和datetime详解
- Python基本知识之datetime模块详解
- Python常用模块之datetime模块详解
- python使用datetime模块处理日期时间及常用功能详解
- Python中的Pandas 时间函数 time 、datetime 模块和时间处理基础讲解
- python datetime模块详解