深入了解 Python 的 datetime
模块
在 Python 中,datetime
模块是处理日期和时间的核心库。无论是记录时间戳、计算时间差,还是格式化时间输出,datetime
模块都提供了强大的支持。本文将从 datetime
的基础概念到进阶应用进行详细讲解,并提供实用的示例代码。
1. datetime
模块简介
datetime
模块用于处理 日期(year, month, day)和时间(hour, minute, second, microsecond),它不仅支持时间格式化,还可以进行时间的加减运算、时间比较等操作。
在 datetime
模块中,常用的类包括:
datetime
:表示日期 + 时间date
:仅表示日期time
:仅表示时间timedelta
:用于时间计算timezone
:处理时区
2. datetime.datetime
:日期时间对象
2.1 获取当前日期时间
from datetime import datetime
now = datetime.now() # 获取当前时间
print(now) # 输出示例:2025-03-03 15:30:45.123456
datetime.now()
返回的是 当前系统时间,精确到微秒。
2.2 指定日期和时间
dt = datetime(2024, 9, 7, 18, 24, 33) # 指定时间
print(dt) # 输出:2024-09-07 18:24:33
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0)
可以 指定年、月、日,以及 时、分、秒、微秒(可选)。
2.3 datetime
转换为字符串(格式化时间)
使用 .strftime()
方法,可以将 datetime
对象转换成字符串:
formatted_time = dt.strftime('%Y-%m-%d %H:%M:%S')
print(formatted_time) # 输出:2024-09-07 18:24:33
常见时间格式符号:
格式符 | 含义 | 示例 |
---|---|---|
%Y |
年(四位数) | 2024 |
%m |
月(两位数) | 09 |
%d |
日(两位数) | 07 |
%H |
小时(24 小时制) | 18 |
%I |
小时(12 小时制) | 06 |
%M |
分钟 | 24 |
%S |
秒 | 33 |
%f |
微秒 | 000123 |
%A |
星期(英文) | Saturday |
2.4 字符串转换为 datetime
dt_str = '2024-09-07 18:24:33'
dt_obj = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')
print(dt_obj) # 输出:2024-09-07 18:24:33
strptime()
用于将 时间字符串 转换为 datetime
对象,格式必须匹配!
3. timedelta
:时间差计算
timedelta
用于时间加减,比如计算 某天之后/之前的时间。
3.1 计算 7 天后的时间
from datetime import timedelta
future_date = now + timedelta(days=7)
print(future_date) # 当前时间 + 7 天
3.2 计算时间差
dt1 = datetime(2024, 9, 7, 18, 24, 33)
dt2 = datetime(2024, 9, 1, 12, 0, 0)
delta = dt1 - dt2 # 计算时间差
print(delta) # 6 days, 6:24:33
print(delta.total_seconds()) # 558273.0(秒)
.total_seconds()
可以获取两个时间之间的秒数。
4. date
和 time
类
4.1 date
只处理日期
from datetime import date
today = date.today() # 获取当前日期
print(today) # 输出:2025-03-03
print(today.year, today.month, today.day) # 分别获取年、月、日
如果只需要处理 日期,可以使用 date
,它比 datetime
更简单。
4.2 time
只处理时间
from datetime import time
t = time(14, 30, 15) # 14:30:15
print(t.hour, t.minute, t.second) # 输出:14 30 15
如果只需要处理 时间(时分秒),可以使用 time
。
5. timestamp
:时间戳转换
5.1 datetime
转 时间戳
timestamp = dt.timestamp()
print(timestamp) # 输出:1725702273.0(单位:秒)
时间戳 是从 1970-01-01 00:00:00 以来的秒数。
5.2 时间戳 转 datetime
不考虑时区
from datetime import datetime
def timestamp_to_hms(timestamp):
# 使用 utcfromtimestamp 方法将时间戳转换为 UTC 时间的 datetime 对象
dt = datetime.utcfromtimestamp(timestamp)
# 格式化 datetime 对象,获取时分秒
return dt.strftime("%H:%M:%S")
# 示例时间戳(单位:秒)
timestamp = 3725
print(timestamp_to_hms(timestamp))
6. 处理时区(timezone
类)
Python datetime
默认是 无时区的(Naive Datetime),如果要处理不同时区,需要用 pytz
或 timezone
进行转换。
from datetime import timezone, timedelta
# 创建 UTC+8 时区
tz_utc_8 = timezone(timedelta(hours=8))
# 获取当前时间,并转换到 UTC+8
now = datetime.now().replace(tzinfo=timezone.utc) # 先设定为 UTC
now_utc8 = now.astimezone(tz_utc_8) # 转换到 UTC+8
print(now_utc8) # 2025-03-03 23:30:45+08:00
注意:Python 内置
datetime
只能支持固定的 UTC 偏移时区,更复杂的时区(如夏令时)需要pytz
处理。
7. datetime
实战应用
7.1 计算某天是星期几
dt = datetime(2024, 9, 7)
print(dt.strftime('%A')) # Saturday
7.2 计算两日期之间的天数
d1 = date(2025, 3, 3)
d2 = date(2024, 9, 7)
delta = d1 - d2
print(delta.days) # 178 天
7.3 判断是否是闰年
def is_leap_year(year):
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
print(is_leap_year(2024)) # True
print(is_leap_year(2025)) # False
总结
datetime
处理 日期 + 时间date
处理 日期(年月日)time
处理 时间(时分秒)timedelta
处理 时间计算timestamp
处理 时间戳timezone
处理 时区
扩展:8. 判断闰年
闰年判断规则
闰年需满足下面两个条件之一:
- 该年份能被 4 整除,不过不能被 100 整除。
- 该年份能被 400 整除。
方法一:使用 calendar.isleap()
函数
import calendar
year = 2024
is_leap = calendar.isleap(year)
print(f"{year} 年是否为闰年: {is_leap}")
9. strftime
日期相关
格式代码 | 描述 | 示例 |
---|---|---|
%a |
星期几的简写 | Mon |
%A |
星期几的全称 | Monday |
%w |
星期几的数字表示(0 表示星期日,6 表示星期六) | 1 |
%d |
月份中的第几天,以 0 填充的两位数 | 01 |
%-d |
月份中的第几天,无填充 | 1 (在支持此语法的系统中,如 Linux) |
%b |
月份的简写 | Jan |
%B |
月份的全称 | January |
%m |
月份,以 0 填充的两位数 | 01 |
%-m |
月份,无填充 | 1 (在支持此语法的系统中,如 Linux) |
%y |
年份的后两位数字 | 23 |
%Y |
完整的四位数年份 | 2023 |
%j |
一年中的第几天,以 0 填充的三位数 | 001 |
%-j |
一年中的第几天,无填充 | 1 (在支持此语法的系统中,如 Linux) |
%U |
一年中的第几周(星期日作为一周的开始),以 0 填充的两位数 | 00 |
%W |
一年中的第几周(星期一作为一周的开始),以 0 填充的两位数 | 00 |
时间相关
格式代码 | 描述 | 示例 |
---|---|---|
%H |
小时(24 小时制),以 0 填充的两位数 | 00 |
%-H |
小时(24 小时制),无填充 | 0 (在支持此语法的系统中,如 Linux) |
%I |
小时(12 小时制),以 0 填充的两位数 | 12 |
%-I |
小时(12 小时制),无填充 | 12 (在支持此语法的系统中,如 Linux) |
%p |
上午或下午(AM 或 PM) | AM |
%M |
分钟,以 0 填充的两位数 | 00 |
%-M |
分钟,无填充 | 0 (在支持此语法的系统中,如 Linux) |
%S |
秒,以 0 填充的两位数 | 00 |
%-S |
秒,无填充 | 0 (在支持此语法的系统中,如 Linux) |
%f |
微秒,以 0 填充的六位数 | 000000 |
时区相关
格式代码 | 描述 | 示例 |
---|---|---|
%z |
时区偏移量,格式为 ±HHMM |
+0800 |
%Z |
时区名称 | CST |
其他
格式代码 | 描述 | 示例 |
---|---|---|
%c |
本地日期和时间的表示 | Mon Jan 1 00:00:00 2023 |
%x |
本地日期的表示 | 01/01/23 |
%X |
本地时间的表示 | 00:00:00 |
%% |
百分号字符 | % |
from datetime import datetime
now = datetime.now()
# 示例格式
formatted_date1 = now.strftime("%Y-%m-%d %H:%M:%S")
formatted_date2 = now.strftime("%A, %B %d, %Y")
formatted_date3 = now.strftime("%I:%M %p")
print(formatted_date1)
print(formatted_date2)
print(formatted_date3)
# 2025-04-09 13:55:53
# Wednesday, April 09, 2025
# 01:55 PM
10. strftime
和 strptime
的区别
strptime
和 strftime
通常是在处理日期和时间相关操作时会用到的两个方法,它们主要用于字符串和日期时间对象之间的转换,不过具体作用是相反的。下面以 Python 为例,详细介绍它们的区别。
功能用途
strptime
:是 “string parse time” 的缩写,其作用是将字符串解析为日期时间对象。当你从文件、用户输入或其他数据源获取到日期时间的字符串表示,想把它转换为程序中可操作的日期时间对象时,就会用到strptime
。strftime
:是 “string format time” 的缩写,用于将日期时间对象格式化为字符串。当你需要将程序中的日期时间对象按照特定的格式输出,比如显示在网页上、保存到文件中时,就会使用strftime
。
语法格式
strptime
:datetime.strptime(date_string, format)
,其中date_string
是要解析的日期时间字符串,format
是该字符串的格式代码。strftime
:datetime_object.strftime(format)
,这里的datetime_object
是一个日期时间对象,format
同样是指定输出字符串的格式代码。
from datetime import datetime
# 使用 strptime 将字符串解析为日期时间对象
date_string = "2024-10-15"
date_object = datetime.strptime(date_string, "%Y-%m-%d")
print(f"解析后的日期对象: {date_object}")
# 使用 strftime 将日期时间对象格式化为字符串
formatted_string = date_object.strftime("%d/%m/%Y")
print(f"格式化后的日期字符串: {formatted_string}")
输出
解析后的日期对象: 2024-10-15 00:00:00
格式化后的日期字符串: 15/10/2024
评论区