Замените "tzinfo" и напечатайте местное время, исправляя шесть минут
Я создаю DataTimeField без часового пояса. Вскоре я редактирую этот TZ "вручную", а затем прошу прочитать значение с локальным TZ. Смотрите конечный результат исправляет шесть минут!
Логика:
>>> 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. Затем я хочу показать пользователю с TimeZone пользователя. При этом у обоих пользователей был один и тот же регион.
Извините мой английский
После ответа от @user6897474 и применения на практике я получил следующее решение:
Я получаю дату и время для POST и файла serializabel перед сохранением, сделайте следующее:
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 = Нет, я гарантирую, что у вас не будет проблем со следующей ошибкой:
Не наивный datetime (tzinfo уже установлен)
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>)
Ссылка: