webentwicklung-frage-antwort-db.com.de

pytz und astimezone () können nicht auf eine naive datetime angewendet werden

Ich habe ein Datum und muss es Zeitzonen bewusst machen.

local_tz = timezone('Asia/Tokyo')
start_date = '2012-09-27'
start_date = datetime.strptime(start_date, "%Y-%m-%d")   
start_date = start_date.astimezone(local_tz)


now_utc = datetime.now(timezone('UTC'))
local_now = now_utc.astimezone(local_tz)

Ich muss herausfinden, ob das stimmt:

print start_date>local_now

Aber ich bekomme diesen Fehler.

   start_date = start_date.astimezone(local_tz)
   ValueError: astimezone() cannot be applied to a naive datetime

Ich konvertiere utc in tokyo ohne Probleme. Ich muss start_date in tokyo gut auf die Zeitzone aufmerksam machen.

Vielen Dank

47
Tampa

Verwenden Sie für pytz-Zeitzonen ihre .localize()-Methode, um aus einem naiven datetime-Objekt ein Objekt mit einer Zeitzone zu machen:

start_date = local_tz.localize(start_date)

Für Zeitzonen ohne DST-Übergang sollte die .replace()-Methode zum Anhängen einer Zeitzone an ein naives datetime-Objekt normalerweise ebenfalls funktionieren:

start_date = start_date.replace(tzinfo=local_tz)

Weitere Informationen finden Sie in der lokalisierten Zeit- und Datumsberechnung der Pytz-Dokumentation.

44
Martijn Pieters

Sie können local_tz.localize(naive_dt, is_dst=None) verwenden, um ein naives datetime-Objekt in ein Zeitzonenobjekt zu konvertieren.

from datetime import datetime
import pytz

local_tz = pytz.timezone('Asia/Tokyo')

start_date = local_tz.localize(datetime(2012, 9, 27), is_dst=None)
now_utc = datetime.utcnow().replace(tzinfo=pytz.utc)

print start_date > now_utc

is_dst=None zwingt .localize (), eine Ausnahme auszulösen, wenn die Ortszeit mehrdeutig ist.

15
jfs

Wenn Sie das Django Rest Framework verwenden, können Sie die DateTimeField-Klasse wie folgt überschreiben:

class DateTimeFieldOverridden(serializers.DateTimeField):

def to_representation(self, value):
    local_tz = pytz.timezone(TIME_ZONE)
    value = local_tz.localize(value)
    return super(DateTimeFieldOverridden, self).to_representation(value)

Und Sie verwenden es so in Ihrem Serializer:

date_time = DateTimeFieldOverridden(format='%d-%b-%Y', read_only=True)

Hoffe das hilft jemandem.

0
Joseph Daudi