广告

Python日期转换技巧:datetime模块实用教程与常见格式转换指南

Python 日期转换的基础:理解 datetime 模块与核心类型

核心类型与基本转换

Python 日期转换技巧的学习中,首先要掌握 datetime 模块的核心类型:datetime、date、time,以及用于时间运算的 timedelta。这些类型共同支撑日常的日期时间处理与格式转换。

通过 strftime 可以把日期时间对象序列化为字符串,而通过 strptime 可以把字符串解析为日期时间对象,这是实现自定义格式转换的基础能力。

import datetime# 获取当前日期时间
now = datetime.datetime.now()# 转为字符串
s = now.strftime("%Y-%m-%d %H:%M:%S")# 从字符串解析回 datetime
dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")

时间戳是一个重要的中间表达,datetime.fromtimestamp 可以把时间戳转换为本地时间,datetime.utcfromtimestamp 则得到 UTC 时间。

ts = 1692936000  # 示例时间戳
local_dt = datetime.datetime.fromtimestamp(ts)
utc_dt = datetime.datetime.utcfromtimestamp(ts)

此外,timedelta 提供了日、时、分、秒的偏移用于日期时间的相加减,帮助实现简单的时间段计算。

from datetime import timedelta, datetimenow = datetime.now()
Tomorrow = now + timedelta(days=1)

本地时间与 UTC 的区别

本地时间UTC 时间在存储和跨系统同步时有不同语义,因此在进行跨时区转换时要特别区分。

使用 datetime.now() 得到的通常是带时区信息的本地时间(若对象有时区信息则为带时区的时间),而 datetime.utcnow() 返回的是不带时区的 UTC 时间。

import datetime# 本地时间
local = datetime.datetime.now()
# UTC 时间
utc = datetime.datetime.utcnow()# 带时区的本地时间(示例:UTC+8)
local_tz = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=8)))

若需要把无时区的时间转换为时间戳,通常需要先把时间视为本地时间或显式设置时区,然后再统一转换为 UTC 时间再计算 timestamp()

aware = local_tz.astimezone(datetime.timezone.utc)
ts = aware.timestamp()

常用格式的字符串与对象之间的相互转换

日常工作中,最常见的就是在 自定义格式和标准日期时间对象之间来回转换。strftime用于序列化,strptime用于反序列化。

在处理 ISO 风格的日期字符串时,保证格式字符串和输入字符串严格对应是关键步骤。

import datetime# 解析常见格式
dt1 = datetime.datetime.strptime("2024-08-24 12:30:45", "%Y-%m-%d %H:%M:%S")# 带毫秒的格式
dt2 = datetime.datetime.strptime("2024-08-24 12:30:45.123", "%Y-%m-%d %H:%M:%S.%f")# 仅日期
d = datetime.date.fromisoformat("2024-08-24")

常见格式转换指南:ISO 8601、RFC 3339、以及自定义格式

ISO 8601 与 fromisoformat 的用法

ISO 8601 是通用的日期时间表示法,常见形态如 2024-08-24T12:34:56+08:00。在 datetime.fromisoformat 中,可以直接解析包含时区偏移的字符串,但在某些版本中对 Z(UTC 的缩写)支持有限,需要先进行替换处理。

使用 dt.isoformat() 可以将 datetime 对象序列化为符合 ISO 8601 的字符串,便于跨系统传输与存储。

Python日期转换技巧:datetime模块实用教程与常见格式转换指南

from datetime import datetimes = "2024-08-24T12:34:56+08:00"
dt = datetime.fromisoformat(s)# 若字符串末尾是 Z,需要替换为 +00:00
s_z = "2024-08-24T04:34:56Z"
dt_z = datetime.fromisoformat(s_z.replace("Z", "+00:00"))# 反序列化后再序列化为 ISO 8601
print(dt.isoformat())

自定义格式的解析与序列化

除了 ISO 8601,还常遇到自定义格式,例如日本日历、中文分隔符等场景。通过 strftimestrptime 可以灵活实现。

在涉及多语言月份名或区域性日期时,Locale 的影响不可忽视,需要在解析前确保环境语言设置正确。

import datetimedt = datetime.datetime(2024, 8, 24, 12, 30, 45)# 自定义格式序列化
s = dt.strftime("%Y/%m/%d %H.%M.%S")# 自定义格式解析
dt_parsed = datetime.datetime.strptime("2024/08/24 12.30.45", "%Y/%m/%d %H.%M.%S")

时区处理与本地化显示

时区是日期时间处理中最容易出错的细节,推荐尽量使用带时区信息的时间对象。

在 Python 3.9+ 中可以直接使用 zoneinfo,配合 datetime 实现简单而明确的时区转换。

from datetime import datetime, timezone
from zoneinfo import ZoneInfo# 当前时区为上海
dt = datetime.now(ZoneInfo("Asia/Shanghai"))
# 转换到 UTC
dt_utc = dt.astimezone(timezone.utc)
print(dt_utc.isoformat())

实战教程:将任意字符串日期转换为标准时间戳与 ISO 8601

从字符串到时间戳(秒级与毫秒级)

将任意字符串日期通过 strptime 解析成 datetime 对象后,再调用 timestamp 得到标准的 UNIX 时间戳。对于毫秒级时间戳,需要乘以 1000。

这是实现跨系统日志对齐与数据对齐的常见做法,能够将文本日期转换为数值表示,便于排序与聚合。

import datetimedef to_timestamp(date_str, fmt="%Y-%m-%d %H:%M:%S"):dt = datetime.datetime.strptime(date_str, fmt)return int(dt.timestamp())def to_timestamp_ms(date_str, fmt="%Y-%m-%d %H:%M:%S.%f"):dt = datetime.datetime.strptime(date_str, fmt)return int(dt.timestamp() * 1000)print(to_timestamp("2024-08-24 12:30:45"))
print(to_timestamp_ms("2024-08-24 12:30:45.123"))

从时间戳到标准日期字符串

将时间戳转回可读日期字符串时,通常使用 fromtimestamp,再结合 strftime 将结果格式化为需要的文本形式。

对于包含时区信息的需求,建议先把时间戳转换为带时区的 datetime,再进行格式化。

import datetimets = 1692834605  # 秒级时间戳
dt = datetime.datetime.fromtimestamp(ts)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))# ISO 8601 输出,包含时区信息(若对象有时区)
print(dt.isoformat(timespec='seconds'))# 毫秒级时间戳的处理
ts_ms = 1692834605123
dt_ms = datetime.datetime.fromtimestamp(ts_ms/1000.0)
print(dt_ms.isoformat(timespec='milliseconds'))

广告

后端开发标签