2016-01-15 40 views
2

TL; DR;Python字符串到Django时区(知道日期时间)

如何转换2016-01-01为django timezone

完整版

我收到一个查询字符串参数从一种形式,我想获得这个字符串,并把它作为在Django日期时间过滤器。 问题是,当我将字符串转换为日期时间时,由于时区不同,我没有做出明显的日期时间,所以我失去了几个小时。也许我在格式化方面失去了自己,但我无法做到。

我有pytz,我在我的设置中也有USE_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)) 

问题出在过滤器..我失去了几个小时,由于从djanto设置时区。

UPDATE1:我不需要一个datetime.now()我的时间转换。我需要一个字符串时间值转换..

任何帮助?

在此先感谢

+0

您在模型中使用了什么字段类型? 'DateField()'?如果是这样,您可以将两个'date'对象('start_date'和'end_date')传递给'created_at__range =()'过滤器。 – gtlambert

+1

[Python时区转换]可能的重复(http://stackoverflow.com/questions/10997577/python-timezone-conversion) –

+0

@ lambo477这是一个'DateTimeField',我试过这样做..但它仍然缺少几个小时来自utc。 – jarussi

回答

2

您正在使用的时区知道在你的数据库DateTimeField领域比较时区不知道的Python Date对象。这可能是更直观的使用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)) 

使用strptime()这将创建unaware_start_dateunaware_end_dateDateTime对象。然后它使用pytz.utc.localize使对象知道时区(您将需要用您的相关时区替换utc)。

然后您可以知道时区DateTime对象 - aware_start_dateaware_end_date。将这些喂入你的过滤器应该会产生所需的结果。

+0

如果你没有安装'pytz'模块,从你的命令行运行'pip install pytz' – gtlambert

相关问题