pytz et astimezone () ne peuvent pas être appliqués à une datetime naïve

j'ai une date et j'ai besoin de faire de fuseau horaire courant.

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)

j'ai besoin de savoir si c'est vrai:

print start_date>local_now

mais je comprends cette erreur.

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

j'ai converti utc en tokyo sans problème. J'ai besoin de rendre start_date timezone conscient ad bien à tokyo.

Merci

42
demandé sur Martijn Pieters 2012-09-27 20:34:02

3 réponses

pytz fuseau horaire, l'utilisation de leurs .localize() méthode pour transformer un naïf datetime objet en un seul avec un fuseau horaire:

start_date = local_tz.localize(start_date)

pour les fuseaux horaires sans transition DST, le .replace() méthode pour joindre un fuseau horaire à un naïf datetime objet devrait normalement aussi:

start_date = start_date.replace(tzinfo=local_tz)

voir le calcul des heures et des dates localisées de la documentation pytz pour plus de détails.

41
répondu Martijn Pieters 2012-10-03 17:07:19

Vous pouvez utiliser local_tz.localize(naive_dt, is_dst=None) pour convertir un objet datetime naïf en un objet timezone-aware.

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 forces .localiser() afin de lever une exception si l'heure locale est ambigu.

14
répondu jfs 2012-10-03 16:57:24

si vous utilisez Django Rest Framework vous pouvez outrepasser la classe DateTimeField comme:

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)

Et vous l'utilisez comme ceci dans votre sérialiseur:

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

Espérons que cela aide quelqu'un.

0
répondu Joseph Daudi 2018-06-19 10:11:15