3

タイムゾーンなしの DataTimeField を作成しています。すぐに、この TZ を「手動で」編集し、ローカル TZ で値を読み取るように依頼します。最終結果を参照してください 6 分を修正 !

論理:

>>> 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>)

注: アイデアは、これが 2 段階で発生するということです。まず、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 = None を置き換えます。次のエラーで問題が発生しないことを保証します。

ナイーブな日時ではありません (tzinfo は既に設定されています)

4

1 に答える 1

8

datetime.replace の代わりに timezone.localize を使用する

>>> 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 分ずれていました。

于 2016-09-29T06:11:25.247 に答える