我有一个设置为2014-02-24 19:00:00+00:00
的日期时间对象,我相信默认设置为UTC(通过Django管理面板)。
这次实际上是非洲/约翰内斯堡,所以我把它转换成这样:
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文档解释了如何转换用户本地时区,但我需要根据模型属性中的时区对其进行转换。
答案 0 :(得分:6)
不要将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)
仅在非时区感知对象上使用此选项。对于时区感知datetime
值,请使用datetime.astimezone()
将值从一个时区转换为另一个时区:
local_timezone = pytz.timezone("Africa/Johannesburg")
local_time_start = self.start_time_unix.astimezone(local_timezone)
如果您的datetime
值附加了错误的时区(它应该代表不同时区的给定时间,而不是该时区的不同时间),请删除旧时区时区首先使用.replace(tzinfo=None), then use
timezone.localize()`:
local_timezone = pytz.timezone("Africa/Johannesburg")
local_time_start = local_timezone.localize(self.start_time_unix.replace(tzinfo=None))