9

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

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

展望这个:

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

这个函数应该返回一个不错的 datetime 对象作为 timezone(),就是它!但是不要!

我所知道的是我收到了这条消息: astimezone() cannot be applied to a naive datetime()

由于我有朋友具有相同的功能并且在他们的 PC 中代码运行良好,但在我的情况下没有。

推测是:你的机器上的配置有问题……但是,不能确定。

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

4

1 回答 1

10

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

pytz页面上所述,您要datetimeobject上调用该方法,而不是在类上:

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

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

正如同一文档指出的那样,您最好.localize()在 timezone 对象上使用该方法:

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对象,并且不需要重新转换到另一个时区。

于 2013-11-04T17:12:26.203 回答