2016-09-02 5 views
0

Я настроил свой часовой пояс в настройках, как America/Guatemala, и у меня есть некоторые поля datetime в моих моделях, я использую default=timezone.now, но он не сохраняет мой местный час, что является UTC -6: 00, сохраняет его как UTC-00: 00. Я не могу это изменить, потому что теперь есть важные данные, хранящиеся в базе данных.Как создать datetime для Django в UTC

У меня есть проблемы с извлечением данных в QuerySet, я отправить строку в request.POST так:

date='1/09/2016' 

И я попытался это настроить свою дату запроса:

f=date.split('/') 
if len(f)>1: 
    initialdate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),0,0,0,tzinfo=pytz.UTC) 
    finaldate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),23,59,59,tzinfo=pytz.UTC) 

И это мой запрос:

sale=Sale.objects.filter(Q(pk=int(cod))|Q(sale_date__range=(initialdate,finaldate))) 

Но из-за 6 часов разницы между мои сохраненные данные и мои локальные даты и время, если я сохраню продажу в 18:01 по местному времени, сохраненные данные будут сохранены как 00:01 утра завтра. Если я хочу проверить все продажи, которые я сделал сегодня, это не показывает мне продажи после 6 вечера, потому что они сохраняются в другую дату.

У меня есть еще один запрос, в котором я отправляю две разные даты, и я использую тот же код, я просто добавляю время 0,0,0 к первому дате и 23,59,59 ко второй дате, но у меня такая же проблема.

Мой вопрос: как я могу добавить эти шесть часов к датам, которые я использую в качестве параметров? Мне нужно знать дату и время, и я не могу ничего изменить в своей модели, я могу изменить только параметры, которые я отправляю на запрос.

ответ

0

У меня также есть вопрос. и то, что я делаю, это то, что: диапазон дат всего дня: 00:00:00 - 23:59:59, и это местное время datetime, но время datetime в дате было преобразовано в utc, поэтому я просто подчиняюсь местные даты и времени 6 часов, и вы можете сделать это,

import datetime 

f=date.split('/') 
if len(f)>1: 
    initialdate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),0,0,0,tzinfo=pytz.UTC) 
    finaldate=datetime.datetime(int(f[2]),int(f[1]),int(f[0]),23,59,59,tzinfo=pytz.UTC) 
    initialdate = initialdate - datetime.timedelta(hours=6) 
    finaldate = finaldate - datetime.timedelta(hours=6) 
0

Отредактировано, чтобы дата известно

чтобы просто изменить дату шесть часов назад вы можете использовать datetime «s timedelta.

Для изменения sale_date объектов в пределах вашего запроса вам просто нужно сделать, это:

import datetime 
import pytz 
for s in sale: 
    sale_date = sale_date - datetime.timedelta(hours=6) 
    sale_date = sale_date.replace(tzinfo=pytz.timezone("America/Guatemala")) 
    s.save() 

Чтобы изменить sale_date всех Sale объектов:

import datetime 
import pytz 
all_sales = Sale.objects.all() 
for sale in all_sales: 
    sale_date = sale_date - datetime.timedelta(hours=6) 
    sale_date = sale_date.replace(tzinfo=pytz.timezone("America/Guatemala")) 
    sale.save() 

Кроме того, для разбора строк, содержащих информацию о времени использования strptime:

import datetime 
date='1/09/2016' 
parsed_date = datetime.datetime.strptime(date, '%w/%m%Y') 

Более подробная информация об этом here

0
import pytz 
from django.utils import timezone 

initialdate = datetime.datetime.combine(date, datetime.time.min.replace(tzinfo=timezone.UTC())).astimezone(pytz.timezone('America/Guatemala')) 

finaldate = datetime.datetime.combine(date, datetime.time.max.replace(tzinfo=timezone.UTC())))).astimezone(pytz.timezone('America/Guatemala')) 
+0

Я попробовал ваш код, он занимает шесть часов с нынешними минимальными и максимальными часов, но есть проблема, в моем по местному времени в 22:11 часов 12 сентября, и сервер имеет 4:11 часов 13 сентября, поэтому у него есть дополнительный день. Когда подкрепление сделано, оно дает мне начальную дату = 18:00 12 сентября, а окончательный срок - 18:00 13 сентября.Итак, если в мое местное время я сделал продажу в 16:00, и я хочу обменять сегодняшние продажи в 10 вечера, я могу видеть только продажи, которые были сделаны после 18:00, прежде чем продажи не будут показаны. Как я могу это решить? – elG

+0

Какова ваша версия Django? Начиная с версии 1.9 django имеет поиск по дате (https://docs.djangoproject.com/el/1.10/ref/models/querysets/#date). В этом случае вы можете сделать что-то вроде 'Sale.objects.filter (sale_date__date = initialdate)' где 'initialdate = timezone.now(). Astimezone (pytz.timezone ('America/Guatemala')). Date()' Какая у вас база данных? –

+0

Или вы можете воспользоваться своим местным временем, преобразовать его в часовой пояс сервера и объединить с time.min/time.max. –