杰瑞科技汇

Python datetime 如何转化格式?

datetime 模块中的主要类

在进行转化之前,先了解几个核心类:

Python datetime 如何转化格式?-图1
(图片来源网络,侵删)
  1. datetime.datetime: 这是最常用的类,它包含日期(年、月、日)和时间(时、分、秒、微秒)信息。
  2. datetime.date: 只包含日期信息(年、月、日)。
  3. datetime.time: 只包含时间信息(时、分、秒、微秒)。
  4. datetime.timedelta: 表示时间间隔,用于日期时间的加减运算。
  5. datetime.tzinfo: 时区信息的抽象基类。

字符串 与 datetime 对象的相互转化

这是最常见的转化需求,通常用于处理从文件、数据库或API获取的日期时间数据。

a. 字符串 转 datetime 对象

使用 datetime.strptime() 方法("string parse time"),你需要提供一个格式字符串来告诉 Python 你的日期字符串是如何组织的。

格式化代码:

  • %Y: 四位数的年份 (e.g., 2025)
  • %m: 两位数的月份 (01-12)
  • %d: 两位数的日期 (01-31)
  • %H: 24小时制的小时 (00-23)
  • %M: 分钟 (00-59)
  • %S: 秒 (00-59)
  • %f: 微秒 (6位数字)

示例代码:

Python datetime 如何转化格式?-图2
(图片来源网络,侵删)
from datetime import datetime
# 字符串
date_str = "2025-10-27 15:30:00"
format_str = "%Y-%m-%d %H:%M:%S"
# 转化
dt_object = datetime.strptime(date_str, format_str)
print(f"原始字符串: {date_str}")
print(f"转化后的 datetime 对象: {dt_object}")
print(f"对象类型: {type(dt_object)}")
# 其他格式的例子
date_str_2 = "27/10/23"
dt_object_2 = datetime.strptime(date_str_2, "%d/%m/%y") # %y 是两位数的年份
print(f"\n转化后的对象: {dt_object_2}")

dateutil 库的替代方案: 如果日期字符串的格式不固定或者比较复杂,strptime 会很麻烦,这时可以使用第三方库 python-dateutil,它能自动解析多种格式。

首先安装:pip install python-dateutil

from dateutil import parser
# 自动解析各种格式的字符串
dt_auto_1 = parser.parse("2025-10-27 15:30:00")
dt_auto_2 = parser.parse("27-Oct-2025")
dt_auto_3 = parser.parse("10/27/23 3:30 PM") # 甚至能处理 AM/PM
print(dt_auto_1)
print(dt_auto_2)
print(dt_auto_3)

b. datetime 对象 转 字符串

使用 datetime.strftime() 方法("string format time"),你需要提供一个格式字符串来定义输出的格式。

示例代码:

Python datetime 如何转化格式?-图3
(图片来源网络,侵删)
from datetime import datetime
# 创建一个 datetime 对象
now = datetime.now()
# 转化为不同格式的字符串
# 格式1: YYYY-MM-DD HH:MM:SS
str_format_1 = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式1: {str_format_1}")
# 格式2: YYYY年MM月DD日
str_format_2 = now.strftime("%Y年%m月%d日")
print(f"格式2: {str_format_2}")
# 格式3: MM/DD/YYYY
str_format_3 = now.strftime("%m/%d/%Y")
print(f"格式3: {str_format_3}")
# 格式4: 月份名, 日, 年 (e.g., Oct 27, 2025)
str_format_4 = now.strftime("%b %d, %Y")
print(f"格式4: {str_format_4}")

datetime 对象 与 date/time 对象的转化

datetime 对象可以方便地提取出其日期或时间部分。

a. datetimedate

直接访问 .date() 属性。

from datetime import datetime
dt = datetime(2025, 10, 27, 10, 30, 0)
# 从 datetime 对象中提取 date 对象
d = dt.date()
print(f"原始 datetime 对象: {dt}")
print(f"提取的 date 对象: {d}")
print(f"对象类型: {type(d)}")

b. datetimetime

直接访问 .time() 属性。

from datetime import datetime
dt = datetime(2025, 10, 27, 10, 30, 0)
# 从 datetime 对象中提取 time 对象
t = dt.time()
print(f"原始 datetime 对象: {dt}")
print(f"提取的 time 对象: {t}")
print(f"对象类型: {type(t)}")

时间戳 与 datetime 对象的转化

时间戳(Timestamp)是指从1970年1月1日00:00:00 UTC(纪元)开始经过的秒数。

a. 时间戳 转 datetime 对象

使用 datetime.fromtimestamp()

from datetime import datetime
import time
# 获取当前时间戳
timestamp = time.time()
print(f"当前时间戳: {timestamp}")
# 将时间戳转化为 datetime 对象
# 默认是本地时区
dt_from_timestamp = datetime.fromtimestamp(timestamp)
print(f"本地时区的 datetime 对象: {dt_from_timestamp}")
# 转化为 UTC 时区的 datetime 对象
dt_utc_from_timestamp = datetime.utcfromtimestamp(timestamp)
print(f"UTC 时区的 datetime 对象: {dt_utc_from_timestamp}")

b. datetime 对象 转 时间戳

使用 datetime.timestamp() 方法(Python 3.3+ 推荐)。

from datetime import datetime
# 创建一个 datetime 对象 (默认是本地时区)
dt = datetime(2025, 10, 27, 10, 30, 0)
print(f"原始 datetime 对象: {dt}")
# 转化为时间戳
timestamp = dt.timestamp()
print(f"转化后的时间戳: {timestamp}")
# 如果是 UTC 时间,需要先指定时区再转换
from datetime import timezone, timedelta
# 创建一个 UTC 时区的 datetime 对象
dt_utc = datetime(2025, 10, 27, 10, 30, 0, tzinfo=timezone.utc)
print(f"\nUTC datetime 对象: {dt_utc}")
# 转化为时间戳
timestamp_utc = dt_utc.timestamp()
print(f"UTC datetime 的时间戳: {timestamp_utc}")

时区处理

处理时区是现代应用开发的关键,Python 3.2+ 内置了对时区的良好支持。

a. 为 datetime 对象添加/修改时区

注意:一个“天真”(naive)的 datetime 对象(没有时区信息)和一个“感知”(aware)的 datetime 对象(有时区信息)不能直接混合使用。

from datetime import datetime, timezone, timedelta
# 1. 创建一个“天真”的 datetime 对象 (无时区)
naive_dt = datetime(2025, 10, 27, 15, 30)
print(f"天真 datetime 对象: {naive_dt}")
# 2. 为它添加时区信息 (变为“感知”对象)
# 方法一: 使用 UTC 时区
aware_dt_utc = naive_dt.replace(tzinfo=timezone.utc)
print(f"感知 UTC datetime 对象: {aware_dt_utc}")
# 方法二: 使用自定义时区 ( UTC+8)
tz_eastern = timezone(timedelta(hours=8)) # 东八区
aware_dt_eastern = naive_dt.replace(tzinfo=tz_eastern)
print(f"感知东八区 datetime 对象: {aware_dt_eastern}")

b. 在不同时区之间转换

使用 astimezone() 方法。

from datetime import datetime, timezone, timedelta
# 假设我们有一个 UTC 时间
utc_time = datetime(2025, 10, 27, 8, 0, tzinfo=timezone.utc)
print(f"UTC 时间: {utc_time}")
# 转换为纽约时区 (UTC-5, 夏令时可能不同,这里简化处理)
tz_ny = timezone(timedelta(hours=-5))
ny_time = utc_time.astimezone(tz_ny)
print(f"纽约时间: {ny_time}")
# 转换为东京时区 (UTC+9)
tz_tokyo = timezone(timedelta(hours=9))
tokyo_time = utc_time.astimezone(tz_tokyo)
print(f"东京时间: {tokyo_time}")

其他常见转化

a. datetime 对象 与 timedelta (时间差) 之间的运算

timedelta 用于表示时间差,可以和 datetime 对象进行加减运算。

from datetime import datetime, timedelta
now = datetime.now()
# 计算未来3天后的时间
future_time = now + timedelta(days=3)
print(f"3天后: {future_time}")
# 计算2小时30分钟前的时间
past_time = now - timedelta(hours=2, minutes=30)
print(f"2小时30分钟前: {past_time}")
# 计算两个 datetime 对象之间的时间差
time_difference = future_time - now
print(f"时间差: {time_difference}")
print(f"时间差的天数: {time_difference.days}")
print(f"时间差的秒数: {time_difference.seconds}")

总结表格

转化目标 方法/函数 示例
字符串 -> datetime datetime.strptime(str, format) datetime.strptime("2025-10-27", "%Y-%m-%d")
datetime -> 字符串 dt_object.strftime(format) now.strftime("%Y/%m/%d")
datetime -> date dt_object.date() dt.date()
datetime -> time dt_object.time() dt.time()
时间戳 -> datetime datetime.fromtimestamp(ts) datetime.fromtimestamp(1698376200)
datetime -> 时间戳 dt_object.timestamp() dt.timestamp()
添加时区 dt_object.replace(tzinfo=...) dt.replace(tzinfo=timezone.utc)
转换时区 dt_object.astimezone(new_tz) utc_time.astimezone(timezone(timedelta(hours=8)))
加减时间差 dt_object +/- timedelta(...) now + timedelta(days=1)

希望这份详细的梳理能帮助你完全掌握 Python datetime 的转化!

分享:
扫描分享到社交APP
上一篇
下一篇