Проблема со сравнением datetime.time () в сигнале pre_save

, если вы можете превратить свой вычислительный алгоритм во что-то, что можно назвать итеративно, вы можете временно отменить управление браузером через setTimeout с коротким значением таймаута.

Например, что-то вроде этого ...

function doCalculation()
{
   //do your thing for a short time

   //figure out how complete you are
   var percent_complete=....

   return percent_complete;
}

function pump()
{
   var percent_complete=doCalculation();

   //maybe update a progress meter here!

   //carry on pumping?
   if (percent_complete<100)
   {
      setTimeout(pump, 50);
   }
}

//start the calculation
pump();

2
задан Martin Stoyanov 18 January 2019 в 15:53
поделиться

2 ответа

Django не дает никаких гарантий относительно того, каким будет часовой пояс ваших datetime в коде Python. Это потому, что 1) часовые пояса в основном имеют отношение к взаимодействию с пользователем (именно поэтому activate() влияет на формы и шаблоны) и 2) операции сравнения Python учитывают часовой пояс, поэтому конкретный часовой пояс не влияет на результат.

Конечно, одна операция, которая не учитывает часовой пояс, - это извлечение времени из даты и времени и сравнение его с другим временем. Поэтому вы должны вручную преобразовать дату и время в правильный часовой пояс. У вас была правильная идея, но replace() это неправильный способ сделать это. (Вместо того, чтобы просто преобразовать в другой часовой пояс, он изменяет фактический момент времени.)

Вместо этого сделайте следующее:

from django.utils.timezone import localtime

if localtime(instance.date_time).time() < instance.interval.from_time:
    pass
0
ответ дан Kevin Christopher Henry 18 January 2019 в 15:53
поделиться

Я немного погуглил и обнаружил, что django намеревается всегда сохранять в формате UTC в модели, но во время извлечения из db преобразовывается в TIME_ZONE, установленный настройками. ссылка . Так что я полагаю, что есть возможность в формате UTC в экземпляре pre-save. Я могу ошибаться, поскольку у меня нет конкретных сильных знаний об этом.

Я думаю, что это сравнение должно быть сделано в режиме реального времени. Так что теперь совершенно безопасно использовать пользователя TIME_ZONE для сравнения с интервалом from_time. Так что мое предложение

import pytz
import datetime


tz = pytz.timezone('Europe/Sofia')
curtime = tz.localize(datetime.datetime.now())

и преобразовать эту строку кода

  if instance.date_time.time() < instance.interval.from_time:
            # this returns True when it's meant to return False

в

   if curtime < instance.interval.from_time:
            # I hope this return False now
0
ответ дан Shakil 18 January 2019 в 15:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: