Django时区的Python字符串(感知日期时间)
TL;博士强> 如何将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
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。您正在将不知道时区的PythonDate
对象与数据库中知道时区的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
中指定的默认时区--时区?ADateField()
?如果是这样,您只需将两个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)