Python Django Time Zone Conversion Incorrect Time for 'US/Pacific' 时区

标签 python django datetime pytz python-datetime

虽然我几乎阅读了所有与时区转换相关的帖子,但我仍然遇到一些问题,我转换的时间不正确

settings.py

TIME_ZONE = 'UTC'
USE_TZ = True

views.py

utc = datetime.utcnow()
instance_time_zone = pytz.timezone(instance.timezone) # 'US/Pacific'
start_date = instance_time_zone.localize(datetime.utcnow(), is_dst=None)

template.html

utc: Oct. 2, 2015, 5:32 p.m. #correct time
start_date: Oct. 3, 2015, 1:32 a.m. #incorrect time

由于某种原因,转换后的时间是错误的,比太平洋时间早 15 小时,比 UTC 时间早 8 小时。

最佳答案

timezone.localize() 应该用于 naive datetime 对象(没有自己的时区的对象)。时区附加到该 datetime,就好像日期和时间对于该时区而言是正确的。因此,在您的情况下,您“本地化”了 UTC,就好像这是您没有 DST 的本地时间,将它向错误的方向移动了 8 小时。

但是您使用了 UTC 时间戳,因此您需要将 UTC 时区附加到它,然后时间戳移到所需的时区:

utc = pytz.utc.localize(datetime.utcnow())
instance_time_zone = pytz.timezone(instance.timezone) # 'US/Pacific'
start_date = utc.astimezone(instance_time_zone)

请注意,utc 值现在是一个带有时区的 datetime 对象,因此您可以使用 datetime.astimezone() method从中产生所需目标时区的值。

演示:

>>> from datetime import datetime
>>> utc = pytz.utc.localize(datetime.utcnow())
>>> utc
datetime.datetime(2015, 10, 2, 17, 58, 10, 168575, tzinfo=<UTC>)
>>> instance_time_zone = pytz.timezone('US/Pacific')
>>> utc.astimezone(instance_time_zone)
datetime.datetime(2015, 10, 2, 10, 58, 10, 168575, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

现在生成的 datetime 与 UTC 相差 5 小时。

但是,如果您要将这些值输出到 Django 模板中,请注意 Django 还会转换时区。查看Django timezone documentation ,特别是 section on using aware datetime objects in templates :

When you enable time zone support, Django converts aware datetime objects to the current time zone when they’re rendered in templates. This behaves very much like format localization.

来自 current time zone section :

You should set the current time zone to the end user’s actual time zone with activate(). Otherwise, the default time zone is used.

然后将 datetime 对象移动到哪个时区都没有关系;它将使用当前时区来显示值。您通常希望在 UTC 时区中使用感知 datetime 对象,然后使用 activate() 切换显示所有内容的时区。

所以在 Django 中,只需使用 timezone.now()无处不在,让模板系统担心将其转换为给定时区。

关于Python Django Time Zone Conversion Incorrect Time for 'US/Pacific' 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913021/

相关文章:

python - 如何在 Django ImageField 中验证图像格式

postgresql - 如何在 PostgreSQL 中将 timestamp(0) 设置为默认值而不是 timestamp(6)?

javascript - React.js : disable DateTime when changed to the past

python - 滚动平均 pandas DataFrame 的所有值

django - 与主管一起启动无花果流程

python - 在文件中搜索并用单词替换数字

mysql - Django 迁移创建不同的表名称

linux - SQLite 中的负日期

python - 是否可以构建一个自动插值的 Pandas 系列?

python - 训练岭回归的 alpha 值