Замените tzinfo и распечатайте с поправками на местное время шесть минут

Я создаю DataTimeField без часового пояса. Вскоре редактирую этот ТЗ "вручную" и потом прошу считать значение с локальным ТЗ. Смотрите конечный результат исправлений шесть минут!

Логика:

>>> import datetime
>>> from django.utils import timezone
>>> test = datetime.datetime(2016, 9, 28, 10, 10, 10)
datetime.datetime(2016, 9, 28, 10, 10, 10)

>>> test = teste.replace(tzinfo=pytz.timezone('America/Sao_Paulo'))
datetime.datetime(2016, 9, 28, 10, 10, 10, tzinfo=<DstTzInfo 'America/Sao_Paulo' LMT-1 day, 20:54:00 STD>)

>>> timezone.activate(pytz.timezone('America/Sao_Paulo'))
>>> timezone.localtime(test)
datetime.datetime(2016, 9, 28, 10, 16, 10, tzinfo=<DstTzInfo 'America/Sao_Paulo' BRT-1 day, 21:00:00 STD>)

ПРИМЕЧАНИЕ. Идея состоит в том, что это происходит в два этапа. Сначала я хочу продолжить работу над созданием TimeZone. Затем я хочу показать пользователю с часовым поясом пользователя. При этом оба пользователя были одного региона.

Извините мой английский


Следуя ответу @user6897474 и применив его на практике, я получил следующее решение:

Я получаю дату и время для файла POST и сериализации перед сохранением, сделайте следующее:

class CheckControllerSerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        datetime = validated_data['datetime'].replace(tzinfo=None)
        validated_data['datetime'] = pytz.timezone('America/Sao_Paulo').localize(datetime)

        return super(CheckControllerSerializer, self).create(validated_data)

Замените tzinfo = None, гарантирую, у вас не будет проблем со следующей ошибкой:

Не наивное datetime (tzinfo уже установлен)


person Luís De Marchi    schedule 28.09.2016    source источник


Ответы (1)


Используйте timezone.localize вместо datetime.replace

>>> test = datetime.datetime(2016, 9, 28, 10, 10, 10)
>>> test = pytz.timezone('America/Sao_Paulo').localize(test)
datetime.datetime(2016, 9, 28, 10, 10, 10, tzinfo=<DstTzInfo 'America/Sao_Paulo' BRT-1 day, 21:00:00 STD>)

>>> timezone.activate(pytz.timezone('America/Sao_Paulo'))
>>> timezone.localtime(test)
datetime.datetime(2016, 9, 28, 10, 10, 10, tzinfo=<DstTzInfo 'America/Sao_Paulo' BRT-1 day, 21:00:00 STD>)

Ссылка :

  1. pytz.localize и datetime.replace

  2. объект datetime при отображении в шаблоне Django всегда отставал на 6 минут

person Francis    schedule 29.09.2016
comment
Отлично, большое спасибо. Только один последний вопрос: установка часового пояса является чем-то глобальным или ограничивает запрос? (надеюсь второй вариант) - person Luís De Marchi; 29.09.2016
comment
Он должен быть без гражданства, т.е. вторым. - person Francis; 02.10.2016