You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问Python datetime对象tzinfo的timedelta与名称属性?

嘿,这确实是序列化带时区datetime时很常见的实用需求!我来帮你理清怎么正确获取这些属性:

首先你要知道,你得到的tzinfo是datetime.timezone类的实例,这个类已经提供了直接访问偏移量和名称的公开属性,完全不用去碰那些下划线开头的私有变量:

获取时区偏移量与名称

直接通过下面的方式就能拿到你想要的两个属性:

import datetime

# 创建带时区的datetime对象
d = datetime.datetime.now().astimezone()

# 获取时区偏移量(返回timedelta对象)
timezone_offset = d.tzinfo.offset
# 获取时区名称(返回字符串)
timezone_name = d.tzinfo.name

print(f"偏移量: {timezone_offset}")
print(f"时区名称: {timezone_name}")

运行后输出会类似:

偏移量: 2:00:00
时区名称: CEST

实现序列化与反序列化

利用上面的属性,就能轻松把datetime对象转换成可存储的基础数据,之后再重建回来:

序列化(转成可存储格式)

把datetime拆成JSON/数据库友好的基础类型:

serialized_data = {
    "year": d.year,
    "month": d.month,
    "day": d.day,
    "hour": d.hour,
    "minute": d.minute,
    "second": d.second,
    "microsecond": d.microsecond,
    "offset_seconds": timezone_offset.total_seconds(),
    "tz_name": timezone_name
}

反序列化(从存储数据重建datetime)

从序列化后的数据恢复成带时区的datetime对象:

# 先重建时区对象
reconstructed_tz = datetime.timezone(
    datetime.timedelta(seconds=serialized_data["offset_seconds"]),
    name=serialized_data["tz_name"]
)

# 再重建datetime对象
reconstructed_datetime = datetime.datetime(
    year=serialized_data["year"],
    month=serialized_data["month"],
    day=serialized_data["day"],
    hour=serialized_data["hour"],
    minute=serialized_data["minute"],
    second=serialized_data["second"],
    microsecond=serialized_data["microsecond"],
    tzinfo=reconstructed_tz
)

print(reconstructed_datetime)

最后提醒一句:别去碰_offset这类下划线开头的私有属性,这些是Python内部使用的,版本迭代时可能会变动,用官方提供的offset和name才是稳定可靠的做法。

内容的提问来源于stack exchange,提问作者buhtz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:34:40