我有一个设置为 2014-02-24 19:00:00+00:00
的日期时间对象,我相信它默认设置为 UTC(通过 Django 管理面板) .
这次其实是Africa/Johannesburg,所以我这样转换:
local_timezone= pytz.timezone("Africa/Johannesburg")
local_time_start = self.start_time_unix.replace(tzinfo=local_timezone)
现在将输出 2014-02-24 19:00:00+01:30
现在我想将其存储为转换后的 UTC 时区,所以我这样做:
utc_time = local_time_start.astimezone(utc)
出于某种原因,这会输出 2014-02-24 17:30:00+00:00
。时间应该是 17:00:00
那么额外的 30 分钟从何而来?
基本上,我试图将 django 管理面板的给定输入作为模型 time_zone 字段的本地时区,但将其存储为 UTC。
有没有更好的方法可以解决这个问题? Django 文档解释了如何转换用户本地时区,但我需要根据模型属性中的时区进行转换。
最佳答案
不要将 datetime.replace()
与 pytz
时区一起使用。 pytz
时区包含历史时区数据(以允许过去的日期使用与 UTC 的正确偏移量),但 datetime.replace()
不能使用正确的信息那种情况。
改为使用 timezone.localize()
方法:
local_timezone = pytz.timezone("Africa/Johannesburg")
local_time_start = local_timezone.localize(self.start_time_unix)
参见 pytz
documentation .
仅在非时区感知对象上使用它。对于时区感知 datetime
值,使用 datetime.astimezone()
将值从一个时区转换为另一个时区:
local_timezone = pytz.timezone("Africa/Johannesburg")
local_time_start = self.start_time_unix.astimezone(local_timezone)
如果您的 datetime
值附加了错误的时区(它应该代表不同时区的给定时间,而不是该时区的不同时间),首先使用 .replace(tzinfo=None) 删除旧时区,然后使用
timezone.localize()`:
local_timezone = pytz.timezone("Africa/Johannesburg")
local_time_start = local_timezone.localize(self.start_time_unix.replace(tzinfo=None))
关于python - 在 Python (Django) 中转换时区,添加神秘的 30 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21987134/