具有相同时区信息的两个python日期时间对象的打印方式不同[重复]

Posted

技术标签:

【中文标题】具有相同时区信息的两个python日期时间对象的打印方式不同[重复]【英文标题】:Two python datetime objects having the same timezone information are printed differently [duplicate] 【发布时间】:2021-12-26 11:23:18 【问题描述】:

我想将 Python 的 datetime 对象的时区从美国/东部时间转换为 UTC。

我所做的是首先制作美国/东部时区的日期时间对象,将其转换为 UTC 时区,然后将其转换回美国/东部时区。预计第一个和最后一个美国/东部时区日期时间对象是相同的。但事实证明,两者的打印方式不同。

我在这里错过了什么?

代码:

from datetime import datetime
import pytz

tz_local = pytz.timezone('US/Eastern')
tz_utc = pytz.utc

datestring = '20210701'
timestring = '04:00:00'
hour, minute, sec = timestring.split(':')
hour, minute, sec = list(map(int, [hour, minute, sec]))

# Make naive datetime object from raw strings
date_naive = datetime.strptime(datestring, '%Y%m%d')
time_naive = date_naive.replace(hour=hour, minute=minute, second=sec)

# Add local timezone information US/Eastern
time_local = time_naive.replace(tzinfo=tz_local)

# Convert to UTC timezone
time_utc = time_local.astimezone(tz_utc)

# Revert to US/Eastern Timezone
time_local_rev = time_utc.astimezone(tz_local)

print(time_local.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
print(time_local_rev.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

输出:

2021-07-01 04:00:00 LMT-0456
2021-07-01 04:56:00 EDT-0400

解决方案

正如@MrFuppes 所说,使用 .localize 方法而不是 .replace 解决了如下问题

# Add local timezone information US/Eastern
time_local = tz_local.localize(time_naive)

生成

2021-07-01 04:00:00 EDT-0400
2021-07-01 04:00:00 EDT-0400

【问题讨论】:

pytz,不得使用replace。你必须localize @MrFuppes 是的,我可以按照您的指导使用 localize 而不是 replace 来解决问题。非常感谢。 【参考方案1】:

如果您可以使用 Python 3.9 或更高版本,请使用内置的 zoneinfo 库来避免“本地化陷阱”。例如:

from datetime import datetime
from zoneinfo import ZoneInfo

tz_local = ZoneInfo('US/Eastern')
tz_utc = ZoneInfo('UTC')

datestring = '20210701'
timestring = '04:00:00'

# make a datetime object and set the time zone with replace:
dt_local = datetime.strptime(datestring+timestring, "%Y%m%d%H:%M:%S").replace(tzinfo=tz_local)

dt_utc = dt_local.astimezone(tz_utc)

print(dt_local)
# 2021-07-01 04:00:00-04:00
print(dt_utc)
# 2021-07-01 08:00:00+00:00

使用 Python backports 使用zoneinfo,或者您可以使用dateutil 来处理时区。直接同时设置tzinfo 是安全的;无需额外的本地化步骤。

【讨论】:

我无法尝试此解决方案,因为我无法更新 python 版本,但感谢您通知它

以上是关于具有相同时区信息的两个python日期时间对象的打印方式不同[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在具有正确日期的python中转换和计算日期时间对象的时区

《日期与时间》第7节:ZonedDateTime与OffsetDateTime

Python:检查解析的日期时间是不是具有正确的时区

如何在python烧瓶中获取具有本地时区的模板文件的修改日期

Python - 给定一个时区感知的日期时间对象,我如何获得一个时区朴素的 UTC 日期时间对象?

在初始化期间创建具有不同时区的新 JavaScript 日期对象 [重复]