python - 在 Python (Django) 中转换时区,添加神秘的 30 分钟

标签 python django date datetime

我有一个设置为 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/

相关文章:

python - 保存时排除内联表单集中的 id 字段

android - 从android应用程序单击按钮更改android手机的系统日期

python - 如何在没有帮助的情况下克服卷积神经网络中的过度拟合?

python - "__main__"只是一个字符串文字吗?

python - 从 Django 1.10 中的 Django url 提供完全静态(文档)网站

python - 尝试在 Python 3 上安装 pygame 时出错

Travis CI 构建上的 Django 单元测试失败

python - 文件未找到错误: [WinError 2] The system cannot find the file specified: 'manage.py'

MySQL:匹配在两个日期之间有 x 个连续日期可用的记录

javascript - 日期字段中的斜杠、反斜杠、连字符有什么区别?