gpt4 book ai didi

python - 奇怪的时区行为 Django

转载 作者:行者123 更新时间:2023-11-29 13:20:22 24 4
gpt4 key购买 nike

这里有些奇怪,我无法理解:

鉴于这些设置:

>>> from django.conf import settings
>>> settings.TIME_ZONE
'Europe/London'
>>> settings.USE_TZ
False

给定以下模型:

HALF_YEAR = timedelta(days=30*6)

class ProductManager(models.Manager):
def get_queryset(self):
from_date = datetime.now() - HALF_YEAR
return super(ProductManager, self).get_queryset().filter(start_date_time__gt=from_date)

class Product(models.Model):
product_number = models.CharField(max_length=45)
start_date_time = models.DateTimeField()
cover_renewal_date = models.DateField()
objects = ProductManager()

这给了我们数据库表:

shopapp=>\d shop_product

Column | Type | Modifiers
-----------------------+--------------------------+----------------------------------------------------------
id | integer | not null default nextval('shop_product_id_seq'::regclass)
product_number | character varying(45) | not null
start_date_time | timestamp with time zone | not null


shopapp=> show timezone;
TimeZone
----------
UTC
(1 row)

具有以下数据:

        shopapp=> select product_number, start_date_time 
from shop_product
where product_number in ('PN63145707', 'PN57284554', 'PN57291674', 'PN66177827');

product_number | start_date_time
---------------+------------------------
PN57284554 | 2013-04-05 00:00:00+00
PN57284554 | 2014-04-05 00:00:00+00
PN57284554 | 2015-04-05 00:00:00+00
PN57284554 | 2016-04-05 00:00:00+00
PN57284554 | 2017-04-05 00:00:00+00
PN57291674 | 2013-04-04 00:00:00+00
PN57291674 | 2014-04-04 00:00:00+00
PN57291674 | 2015-04-04 00:00:00+00
PN57291674 | 2016-04-04 00:00:00+00
PN57291674 | 2017-04-04 00:00:00+00
PN63145707 | 2015-03-25 00:00:00+00
PN63145707 | 2016-03-25 00:00:00+00
PN63145707 | 2017-03-25 00:00:00+00
PN66177827 | 2017-03-25 00:00:00+00
(14 rows)

但是运行这段代码:

now = datetime.now().date()
start_time = now - timedelta(days=1)
end_time = now + timedelta(days=14)
res = Product.objects.filter(start_date_time__range=(start_time, end_time), product_number__in=['PN63145707', 'PN57284554', 'PN57291674', 'PN66177827'])
for item in res:
print(item.product_number, str(item.start_date_time))

给我结果

(u'PN63145707', '2017-03-25 00:00:00')
(u'PN57284554', '2017-04-05 01:00:00')
(u'PN57291674', '2017-04-04 01:00:00')
(u'PN66177827', '2017-03-25 00:00:00')

BST(3 月 26 日)之后的任何 start_date_time 似乎都显示为凌晨 1 点。如果 USE_TZ 设置为 False,为什么会这样?

谢谢。

版本:django-1.10.4,postgresql psql(9.4.10,服务器9.6.1)

编辑:当我使用相同的设置运行相同的代码时,在我们的测试服务器上结果是不一样的:

In [20]: settings.TIME_ZONE
Out[20]: 'Europe/London'

In [21]: settings.USE_TZ
Out[21]: False

(u'PN63145707', '2017-03-25 00:00:00')
(u'PN66177827', '2017-03-25 00:00:00')
(u'PN57291674', '2017-04-04 00:00:00')
(u'PN57284554', '2017-04-05 00:00:00')

为什么这些记录没有像生产服务器上的值那样调整为欧洲/伦敦时区?

最佳答案

您看到的行为与 documentation 中描述的完全一样.它是 Django 坚持使用 postgresql timestamptz 而不是 timestamp 的副产品。

在内部,Postgresql timestamptz 以 UTC 格式存储日期时间。当被查询时,它会返回转换为请求者时区的时间戳。

documentation请注意,当 USE_TZ 设置为 false 时,数据库连接时区将设置为 TIMEZONE(在您的情况下为 Europe/London)。这将导致 Postgresql 在将它们提供给 Django 之前将存储的 UTC 时间戳转换为伦敦时间

关于python - 奇怪的时区行为 Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42988974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com