datetime: obtenir l'horodatage avec le décalage du fuseau horaire

Nov 23 2020

Je souhaite obtenir l'horodatage des dates dans les formats suivants:

Mon, 23 Nov 2020 19:00:00 GMT
Mon, 23 Nov 2020 20:00:00 +0100

J'utilise les instructions suivantes pour convertir des dates en datetimeobjets:

dateobj = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S %Z')
dateobj = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S %z')

Mais en utilisant la .timestamp()méthode, différentes secondes de l'époque sont imprimées. Pourquoi la %Zdirective n'ajoute- t-elle pas d' informations sur le fuseau horaire à l' datetimeobjet? Comment puis-je prendre en compte le fuseau horaire pour que l'horodatage soit égal?

Réponses

MrFuppes Nov 24 2020 at 07:21

Veuillez noter Fuseau horaire d'analyse datetime incohérent en Python . Votre problème est %Zqu'il strptime accepte certaines chaînes (GMT, UTC et toute valeur dans time.tzname - docs ), mais n'en fait rien. L'objet datetime retourné est naïf - c'est pourquoi Python supposera que c'est l'heure locale si vous appelez sa timestamp()méthode.

Vous pouvez utiliser l'analyseur de dateutil à la place:

from dateutil.parser import parse

for s in ("Mon, 23 Nov 2020 19:00:00 GMT", "Mon, 23 Nov 2020 20:00:00 +0100"):
    dt = parse(s)
    print(repr(dt), dt.timestamp())

# datetime.datetime(2020, 11, 23, 19, 0, tzinfo=tzutc()) 1606158000.0
# datetime.datetime(2020, 11, 23, 20, 0, tzinfo=tzoffset(None, 3600)) 1606158000.0