python-3.x - 同一时区的python时区问题
问题描述
为什么我在一个具有几乎相同日期时间结构的文件中得到不同的结果时区?
print(datetime.datetime.now(pytz.timezone('Europe/Moscow')))
>>> 2020-05-31 12:55:04.778210+03:00
print(datetime.datetime(2020, 5, 31, 12, 54, 0, 0, pytz.timezone('Europe/Moscow')))
>>> 2020-05-31 12:54:00+02:30
解决方案
问题在于pytz
使用与 Python 标准库不同的时区模型这一事实。这是 Paul Ganssle 的博客文章,解释了这个问题。
正确pytz
的方法是使用localize
其timezone
类的方法:
import datetime
import pytz
print(datetime.datetime.now(pytz.timezone('Europe/Moscow')))
>>> 2020-05-31 15:15:45.559007+03:00
print(pytz.timezone('Europe/Moscow').localize(datetime.datetime(2020, 5, 31, 15, 16, 0, 0)))
>>> 2020-05-31 15:16:00+03:00
在datetime.datetime.now(pytz.timezone('Europe/Moscow'))
正确创建datetime
具有定义时区的对象时,首先datetime.datetime(2020, 5, 31, 12, 54, 0, 0, pytz.timezone('Europe/Moscow'))
创建一个天真的datetime
对象,然后replace
是时区。replace
使用时避免pytz
使用,而是使用localize
。
的替代方案pytz
是dateutil
。dateutil
在这里,由于使用了标准库的时区模型,上述操作更加直接:
import dateutil
print(datetime.datetime.now(dateutil.tz.gettz('Europe/Moscow')))
>>> 2020-05-31 15:13:55.967773+03:00
print(datetime.datetime(2020, 5, 31, 15, 14, 0, 0, dateutil.tz.gettz('Europe/Moscow')))
>>> 2020-05-31 15:14:00+03:00
推荐阅读
- php - 插入 optiont 标签提取
- reactjs - 如何在 react redux saga 应用中实现 csrf
- java - 识别 ListView 项中的 AutocompleteTextView
- reactjs - 重构反应代码
- android - 一个进程试图 chmod 一个文件,而另一个进程已经写入该文件?
- java - 验证失败后Primefaces奇怪的属性
- azure-active-directory - Azure AD B2C - 不支持客户端凭据流。可用的解决方法?
- ios - 本地通知swift上缺少徽章和声音
- amazon-web-services - 操作“部署”中的 Terraform CodePipeline ActionType 不可用
- java - 出于验证目的需要有关 CSV 数据的临时数据存储的建议