Django时区的Python字符串(感知日期时间)

Django时区的Python字符串(感知日期时间),python,django,datetime,timezone,pytz,Python,Django,Datetime,Timezone,Pytz,TL;博士 如何将2016-01-01转换为Django时区 完整版本: 我从一个表单接收到一个查询字符串参数,我想得到该字符串并将其用作Django中的datetime过滤器。 问题是,当我将字符串转换为datetime时,它没有生成可感知的datetime,因此由于时区不同,我会损失几个小时。也许我在格式化中迷失了自我,但我无法做到这一点 我有pytz,我的设置中也有使用TZ=True 例如: from datetime import date # Example from what I r

TL;博士

如何将
2016-01-01
转换为Django
时区

完整版本

我从一个表单接收到一个查询字符串参数,我想得到该字符串并将其用作Django中的datetime过滤器。 问题是,当我将字符串转换为datetime时,它没有生成可感知的datetime,因此由于时区不同,我会损失几个小时。也许我在格式化中迷失了自我,但我无法做到这一点

我有pytz,我的设置中也有
使用TZ=True

例如:

from datetime import date
# Example from what I receive as GET querystring parameter
start_date, end_date = '15-01-2016', '16-01-2016'
DATE_FORMAT = '%Y-%m-%d'
start_date = start_date.split('-')
start_date = date(int(start_date[2]), int(start_date[1]), int(start_date[0]))
sd_filter = start_date.strftime(DATE_FORMAT)

end_date = end_date.split('-')
end_date = date(int(end_date[2]), int(end_date[1]), int(end_date[0]))
ed_filter = end_date.strftime(DATE_FORMAT)

#query
my_list = MyModel.objects.filter(created_at__range=(sd_filter, ed_filter))
问题在于过滤器。由于Django设置的时区,我损失了几个小时


更新:我不需要将
datetime.now()转换为我的时间。我需要将字符串转换为datetime。

您正在将不知道时区的Python
Date
对象与数据库中知道时区的
DateTimeField
字段进行比较。使用
DateTime
对象可能更直观,并且可以通过以下方式轻松识别时区:

import datetime
import pytz

start_date = '15-01-2016' 
end_date = '16-01-2016'
date_format = '%d-%m-%Y'

unaware_start_date = datetime.datetime.strptime(start_date, date_format)
aware_start_date = pytz.utc.localize(unaware_start_date)

unaware_end_date = datetime.datetime.strptime(end_date, date_format)
aware_end_date = pytz.utc.localize(unaware_end_date)

my_list = MyModel.objects.filter(created_at__range=(aware_start_date, aware_end_date))
这将使用
strtime()
创建
unknowledge\u start\u date
unknowledge\u end\u date
对象。然后,它使用
pytz.utc.localize
来识别对象的时区(您需要将
utc
替换为您的相关时区)


然后,您可以让时区感知
DateTime
对象-
aware\u start\u date
aware\u end\u date
。将这些输入到您的过滤器中应该会产生所需的结果。

我知道这很旧,但可能会有所帮助,因为我也遇到了这种情况:

使用make_aware()怎么样


这将使用当前活动的时区(由
时区激活。激活
)。如果没有明确激活时区,它将使用
settings.py

中指定的默认时区--
时区?A
DateField()
?如果是这样,您只需将两个
date
对象(
start\u date
end\u date
)传递给您在
范围=()
中创建的
过滤器。可能重复@lambo477它是一个
DateTimeField
,我尝试过这样做。。但是它离utc还有几个小时。@LajosArpad我试着使用答案中的内容,但对我无效:(如果您没有安装
pytz
模块,请从命令行运行
pip install pytz
from django.utils import timezone
timestamp_raw = timezone.now() #current time, or use whatever time you have
date_format = '%Y-%m-%d %H:%M:%S' #time format day-month-year hour:minutes:seconds
timestamp = timezone.datetime.strftime(timestamp_raw, date_format)
from django.utils import timezone
timestamp_raw = timezone.now() #current time, or use whatever time you have
date_format = '%Y-%m-%d %H:%M:%S' #time format day-month-year hour:minutes:seconds
timestamp = timezone.datetime.strftime(timestamp_raw, date_format)