2016-01-15 5 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() в свое время .. Мне нужно преобразовать строку в DateTime ..

Любой помочь?

Заранее спасибо

+0

Какой тип поля вы используете в своей модели? 'DateField()'? Если это так, вы можете просто передать два объекта 'date' (' start_date' и 'end_date') в ваш фильтр' created_at__range =() '. – gtlambert

+1

Возможный дубликат [Python Timezone conversion] (http://stackoverflow.com/questions/10997577/python-timezone-conversion) –

+0

@ lambo477 Это 'DateTimeField', и я попытался это сделать .. но он все еще не хватает нескольких часов от utc. – jarussi

ответ

2

Вы сравниваете часовые пояса не подозревая 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)) 

Это создает unaware_start_date и unaware_end_dateDateTime объектов с помощью strptime(). Затем он использует pytz.utc.localize, чтобы информировать объекты о времени (вам нужно будет заменить utc на соответствующий часовой пояс).

После этого вы можете узнать DateTime - aware_start_date и aware_end_date. Подача их в фильтр должна давать желаемые результаты.

+0

Если у вас нет модуля 'pytz', запустите' pip install pytz' из командной строки – gtlambert

Смежные вопросы