无法在Trunc功能中更改TImezone。始终需要来自settings.py
的时区import pytz
ind = pytz.timezone('Asia/Calcutta')
查询:
queryset = Order.objects.annotate(date=TruncDate('created_at', tzinfo=ind)).values('date')
在queryset.query
SELECT DATE(CONVERT_TZ(`nm_order`.`created_at`, 'UTC', UTC)) AS `date` FROM `nm_order`
参考:Trunc in Django
但对于Extract,它正在发挥作用
ORM:
queryset = Order.objects.annotate(date=ExtractDay('created_at',tzinfo=ind)).values('date')
查询:
SELECT EXTRACT(DAY FROM CONVERT_TZ(`nm_order`.`created_at`, 'UTC', Asia/Calcutta)) AS `date` FROM `nm_order`
我想念Trunc
中的某些内容吗?
settings.py
IME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
答案 0 :(得分:2)
您需要使用TruncDay()
代替TruncDate
。在文档的该部分下面的用法示例中,您将看到两者之间的区别。
TruncDate
没有采用时区选项 - 它使用当前时区并为您提供该时区的日期。
我认为两者之间的区别在于TruncDate
返回DateField
,根据定义,它不能识别时区。另一方面,TruncDay
返回DateTimeField
(时间部分设置为00:00:00),可以识别时区。
答案 1 :(得分:0)
检查TruncDate类后看起来没有时区选项
class TruncDate(TruncBase):
kind = 'date'
lookup_name = 'date'
@cached_property
def output_field(self):
return DateField()
def as_sql(self, compiler, connection):
# Cast to date rather than truncate to date.
lhs, lhs_params = compiler.compile(self.lhs)
tzname = timezone.get_current_timezone_name() if settings.USE_TZ else None
sql, tz_params = connection.ops.datetime_cast_date_sql(lhs, tzname)
lhs_params.extend(tz_params)
return sql, lhs_params