【问题标题】:astimezone() cannot be applied to a naive datetimeastimezone() 不能应用于天真的日期时间
【发布时间】:2013-11-15 09:18:15
【问题描述】:

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() 不能应用于一个幼稚的 datetime()

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

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

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

【问题讨论】:

  • 您的示例代码中的datetime 是模块还是datetime.datetime 类?
  • 是的!一切看起来都很好。我的意思是,所需的一切都导入到示例代码中。
  • 否,datetime 未在您的示例代码中定义(用于最后一行)。

标签: python datetime timezone


【解决方案1】:

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

正如pytz page 中所记录的,您希望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 对象,无需重新转换为另一个时区。

【讨论】:

  • 我更改了您显示的代码,但它仍然给出: astimezone() 不能应用于幼稚的日期时间
  • @MartijinPieters,我真的很高兴你能帮我解决这个问题,但这个案例很奇怪。确实与我的PC idk有关!函数的返回是这样的: 2013-11-01T23:00:00+00:00 最后可以看到 00+00:00 (应该不是这样)。
  • @Doug:这是日期时间对象的字符串表示形式。 一切正常
  • 在最后一次修改代码之后,它得到了相同的ExceptionType:ValueError,现在消息变为:Not naive datetime (tzinfo is already set)
  • @Doug:一些你的输入有一个时区作为解析字符串的一部分。
猜你喜欢
  • 2012-09-19
  • 2023-01-13
  • 2013-03-11
  • 2010-10-22
  • 2012-12-27
  • 2014-02-02
  • 2021-07-07
  • 1970-01-01
相关资源
最近更新 更多