astimezone() 不能应用于朴素的日期时间


时区

()和日期时间是否可能在时间等方面与我的操作系统发生冲突?

起初这是一个愚蠢的问题,因为我遇到了这个问题,我看不出它为什么或从哪里发生。

看这个:

def parse_datetime(a_datetime, account):
    tz = pytz.timezone(account.timezone_name)
    return datetime.astimezone(parser.parse(a_datetime), tz)

这个函数应该简单地返回一个漂亮的日期时间对象作为 timezone(),就它!但不要!

只知道我收到这条消息:astimezone() 不能应用于朴素的日期时间()

由于我有具有相同功能的朋友并且在他们的 PC 中代码运行良好,但就我而言并非如此。

猜测是:你机器里的配置有不对劲的地方......但是,不确定。

如果还有其他人面对这个问题并且知道它是什么只是阅读这里的内容,好吧,如果你告诉我,我会很高兴。提前感谢!

您使用了错误的方法将时区附加到datetime对象。

pytz页上所述,您希望datetime对象上调用该方法,而不是在类上调用该方法:

def parse_datetime(a_datetime, account):
    tz = pytz.timezone(account.timezone_name)
    return parser.parse(a_datetime).astimezone(tz)

这仅适用于已经本地化的datetime对象(例如,以 UTC 作为时区)。

正如同一文档所指出的,您最好在时区对象上使用 .localize() 方法:

def parse_datetime(a_datetime, account):
    tz = pytz.timezone(account.timezone_name)
    return tz.localize(parser.parse(a_datetime))

这适用于朴素datetime对象,并且对于具有历史数据的时区也执行正确的操作。

如果您有混合数据,有些有时区,有些没有时区,那么您应该测试时区已经存在:

def parse_datetime(a_datetime, account):
    dt = parser.parse(a_datetime)
    if dt.tzinfo is None:
        tz = pytz.timezone(account.timezone_name)
        dt = tz.localize(dt)
    return dt

已附加时区的时间戳将导致时区感知datetime对象,并且不需要重新转换为另一个时区。

相关内容

  • 没有找到相关文章

最新更新