python - astimezone() 不能应用于原始日期时间

标签 python datetime timezone

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

起初这是一个愚蠢的问题,因为我遇到了这个问题,但我看不出它发生的原因或发生的位置。

看这个:

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

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

我所知道的是我收到了这条消息:astimezone() 不能应用于 naive datetime()

因为我有 friend 具有相同的功能并且在他们的 PC 上代码运行正常,但在我的情况下却不能。

推测是:您机器的配置有问题...但是,不确定。

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

最佳答案

您使用错误的方法将时区附加到 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 对象,并且不需要重新转换为另一个时区。

关于python - astimezone() 不能应用于原始日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773076/

相关文章:

python - Django - 使用 unique_together = (ForeignKey, IntegerField) 重新排序(更新)对象

python - 日志记录中标准输出捕获的最大递归深度

python - 类外的变量范围

ruby-on-rails - 为 '/edit' View 填充表单字段时,Rails 应用程序 config.time_zone 不适用

java - Oracle 时间戳到 BST 时间的转换

python - 生成随机 IPv6 地址

python - 如果日期改变则增加时间?

python - 将字符串转换为日期时间对象

delphi - 当默认语言为非英语时,如何使用 TDateCalendar 作为英语(日期字幕)?

c# TimeZoneInfo 序列化