TruncDate时区参数在Django中不起作用

时间:2017-10-25 11:29:34

标签: python mysql django

无法在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

检查sql查询时
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

中的TimeZone设置
IME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

2 个答案:

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