Python获取当前时间与指定时间的三种常用写法
在 Python 日常开发中,无论是记录系统运行日志、统计接口响应耗时,还是根据业务规则筛选特定交易日的账单,时间的获取与构造都是最基础的操作。很多初学者在面对标准库与第三方库时常感到困惑,不知道何时该用时间戳,何时该用日期对象。在 Python 中,获取当前时间与构建指定时间主要有三种最常用的写法:内置面向对象的 datetime 模块、偏向底层与时间戳的 time 模块,以及擅长智能解析复杂字符串的第三方扩展库 python-dateutil。掌握这三种方式的具体用法与适用场景,能够帮助你在不同业务需求下快速选择最合适的工具。
写法一:内置 datetime 模块(标准推荐)
datetime 是 Python 官方推荐的标准库模块,它将日期和时间封装为面向对象的形式,非常适合绝大多数日常应用、Web 开发以及数据库时间字段映射。
1. 获取当前时间
使用 datetime.datetime.now() 即可获取本地环境的当前日期和时间。如果需要协调世界时(UTC),可以传入时区参数或使用 datetime.now(timezone.utc):
from datetime import datetime, timezone
# 1. 获取本地当前时间(包含微秒)
now_local = datetime.now()
print("本地当前时间:", now_local)
# 2. 获取 UTC 当前时间(带时区感知)
now_utc = datetime.now(timezone.utc)
print("UTC 当前时间:", now_utc)
# 3. 格式化输出为可读字符串
formatted_now = now_local.strftime("%Y-%m-%d %H:%M:%S")
print("格式化输出:", formatted_now)
示例输出:
本地当前时间: 2026-10-23 08:27:30.123456
UTC 当前时间: 2026-10-23 00:27:30.123456+00:00
格式化输出: 2026-10-23 08:27:30
2. 获取指定时间
构建指定时间有三种典型途径:显式数值传参、ISO 8601 标准字符串解析、自定义格式字符串解析:
- 显式构造参数:直接调用
datetime(year, month, day, hour, minute, second)。 - 标准 ISO 字符串解析:使用
datetime.fromisoformat(),无需手动编写格式化占位符。 - 自定义字符串解析:使用
datetime.strptime(date_string, format),精准匹配指定模板。
from datetime import datetime
# 途径 A:显式构造 2026年12月31日 23时59分50秒
specific_time_a = datetime(2026, 12, 31, 23, 59, 50)
print("显式构造指定时间:", specific_time_a)
# 途径 B:从 ISO 标准格式字符串解析
iso_str = "2026-06-18T14:30:00"
specific_time_b = datetime.fromisoformat(iso_str)
print("ISO 解析指定时间:", specific_time_b)
# 途径 C:从自定义格式字符串解析
custom_str = "2026/08/15 09:15:20"
specific_time_c = datetime.strptime(custom_str, "%Y/%m/%d %H:%M:%S")
print("模版解析指定时间:", specific_time_c)
写法二:内置 time 模块(面向底层与时间戳)
time 模块直接封装了底层 C 运行时库的时间接口。与 datetime 不同,它更侧重于表示从 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)开始计算的秒数(浮点型时间戳),或者使用包含 9 个元素的结构化元组 struct_time。
1. 获取当前时间
在性能测试、打点统计或生成唯一标识时,时间戳最为常用:
import time
# 1. 获取当前时间戳(秒级浮点数,带小数秒)
timestamp = time.time()
print("当前Unix时间戳:", timestamp)
# 2. 获取本地当前时间的 struct_time 结构体
local_st = time.localtime(timestamp)
print("本地结构化时间:", local_st)
# 3. 将当前时间直接转为格式化字符串
readable_time = time.strftime("%Y-%m-%d %H:%M:%S", local_st)
print("格式化当前时间:", readable_time)
示例输出:
当前Unix时间戳: 1792715250.654321
本地结构化时间: time.struct_time(tm_year=2026, tm_mon=10, tm_mday=23, tm_hour=8, tm_min=27, tm_sec=30, tm_wday=4, tm_yday=296, tm_isdst=0)
格式化当前时间: 2026-10-23 08:27:30
2. 获取指定时间
使用 time 模块获取并表达指定时间,核心在于通过 time.strptime() 将指定时间的字符串解析为 struct_time,如果后续需要用于计算,再使用 time.mktime() 转换为时间戳:
import time
# 目标指定时间字符串
target_str = "2026-11-11 10:00:00"
# 步骤 1:解析字符串为 struct_time
target_st = time.strptime(target_str, "%Y-%m-%d %H:%M:%S")
print("指定时间的结构体:", target_st)
print(f"提取指定年份: {target_st.tm_year}, 星期几(0-6): {target_st.tm_wday}")
# 步骤 2:转为 Unix 时间戳(可用于与当前时间戳做差值比对)
target_ts = time.mktime(target_st)
print("指定时间对应的时间戳:", target_ts)
# 步骤 3:计算指定时间距离当前时间的差值秒数
diff_seconds = target_ts - time.time()
print(f"距离目标时间还剩: {diff_seconds:.1f} 秒")
写法三:第三方 dateutil 库(智能解析与高级指定时间)
在面对来自日志文件、爬虫抓取数据或用户前端输入的指定时间字符串时,往往格式千奇百怪(例如 Oct 23, 2026、2026.10.23 08:30 等)。如果用标准库的 strptime,每种格式都必须手写对应的格式串,稍有空格或标点差异就会抛出 ValueError。此时使用广泛认可的第三方增强库 python-dateutil 是极佳的选择。
python-dateutil 是纯 Python 库,使用前只需通过 pip 安装:pip install python-dateutil。
1. 获取当前时间
dateutil 主要是对 datetime 的扩展和增强,它通常直接结合 datetime.now() 配合其时区模块 dateutil.tz 获取带有时区的当前时间:
from datetime import datetime
from dateutil import tz
# 获取本地带精确时区信息的当前时间
current_tz_now = datetime.now(tz.tzlocal())
print("当前时区感知时间:", current_tz_now)
print("时区名称:", current_tz_now.tzname())
2. 获取指定时间(自动推断解析)
dateutil.parser.parse() 是其核心杀手级功能,它能够在完全不指定任何 %Y、%m 格式占位符的情况下,智能推断并解析绝大多数常见的日期时间格式:
from dateutil import parser
from dateutil.relativedelta import relativedelta
from datetime import datetime
# 场景 1:解析各种自然风格的指定时间字符串(完全无需配置格式模版)
inputs = [
"2026-10-23 15:30:00",
"Oct 23, 2026 3:30 PM",
"2026/10/23",
"Friday, Oct 23, 2026"
]
for item in inputs:
dt = parser.parse(item)
print(f"原始文本: {item:<22} -> 解析结果: {dt}")
# 场景 2:基于当前时间推算相对指定时间(如下个月的今天,或上一季度末)
now = datetime.now()
next_month_same_day = now + relativedelta(months=+1)
print("下个月的同一时间点:", next_month_same_day.strftime("%Y-%m-%d %H:%M:%S"))
示例输出:
原始文本: 2026-10-23 15:30:00 -> 解析结果: 2026-10-23 15:30:00
原始文本: Oct 23, 2026 3:30 PM -> 解析结果: 2026-10-23 15:30:00
原始文本: 2026/10/23 -> 解析结果: 2026-10-23 00:00:00
原始文本: Friday, Oct 23, 2026 -> 解析结果: 2026-10-23 00:00:00
下个月的同一时间点: 2026-11-23 08:27:30
三种写法的核心差异与选型建议
为帮助读者在实际工程开发中精准决策,下表与对比图汇总了这三种常用写法的核心能力维度:
常见注意事项与避坑指南
- 字母大小写混淆:在调用
strftime或strptime时,月份是%m(小写),而分钟是%M(大写);24小时制小时是%H,而12小时制是%I。混淆大小写会导致解析崩溃或产生荒谬的日期。 - 时区意识(Naive vs Aware):
datetime.now()默认返回 naive 对象(不携带时区信息),无法与带有tzinfo的 aware 对象直接进行加减比较,否则会抛出TypeError: can't subtract offset-naive and offset-aware datetimes。跨时区系统开发时,建议始终使用datetime.now(timezone.utc)统一度量。 - 时间戳精度问题:
time.time()返回的浮点数受限于不同操作系统的时钟硬件精度。如果需要纳秒级精准打点,建议使用 Python 3.7+ 提供的time.time_ns()或time.perf_counter()。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













