Python获取当前时间与指定时间的三种常用写法

半杯拿铁
半杯拿铁
发布时间:2026-10-24 | 2人浏览过
原创

在 Python 日常开发中,无论是记录系统运行日志、统计接口响应耗时,还是根据业务规则筛选特定交易日的账单,时间的获取与构造都是最基础的操作。很多初学者在面对标准库与第三方库时常感到困惑,不知道何时该用时间戳,何时该用日期对象。在 Python 中,获取当前时间与构建指定时间主要有三种最常用的写法:内置面向对象的 datetime 模块、偏向底层与时间戳的 time 模块,以及擅长智能解析复杂字符串的第三方扩展库 python-dateutil。掌握这三种方式的具体用法与适用场景,能够帮助你在不同业务需求下快速选择最合适的工具。

Python获取当前时间与指定时间的三种常用写法
图1:Python 三种常用时间写法决策路径与方法定位

写法一:内置 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)
Python获取当前时间与指定时间的三种常用写法
图2:datetime 模块时间生成、解析与转换关系

写法二:内置 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} 秒")
Python获取当前时间与指定时间的三种常用写法
图3:time 模块时间戳、结构化元组与字符串转换流程

写法三:第三方 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

三种写法的核心差异与选型建议

为帮助读者在实际工程开发中精准决策,下表与对比图汇总了这三种常用写法的核心能力维度:

Python获取当前时间与指定时间的三种常用写法
图4:三种时间处理方案对比矩阵与选型准则

常见注意事项与避坑指南

  1. 字母大小写混淆:在调用 strftime 或 strptime 时,月份是 %m(小写),而分钟是 %M(大写);24小时制小时是 %H,而12小时制是 %I。混淆大小写会导致解析崩溃或产生荒谬的日期。
  2. 时区意识(Naive vs Aware):datetime.now() 默认返回 naive 对象(不携带时区信息),无法与带有 tzinfo 的 aware 对象直接进行加减比较,否则会抛出 TypeError: can't subtract offset-naive and offset-aware datetimes。跨时区系统开发时,建议始终使用 datetime.now(timezone.utc) 统一度量。
  3. 时间戳精度问题:time.time() 返回的浮点数受限于不同操作系统的时钟硬件精度。如果需要纳秒级精准打点,建议使用 Python 3.7+ 提供的 time.time_ns() 或 time.perf_counter()。
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表