在Python(Django)中转换时区增加了一个神秘的30分钟

时间:2014-02-24 11:58:38

标签: python django date datetime

我有一个设置为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文档解释了如何转换用户本地时区,但我需要根据模型属性中的时区对其进行转换。

1 个答案:

答案 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)

请参阅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), then use timezone.localize()`:

local_timezone = pytz.timezone("Africa/Johannesburg")
local_time_start = local_timezone.localize(self.start_time_unix.replace(tzinfo=None))