2017-06-29 6 views
0

J'essaie d'obtenir une sortie compatible RFC3339 à partir du module de temps de python, en utilisant la fonction time.strftime().Est-ce que python time.strftime traite correctement les options de fuseau horaire (pour RFC 3339)

Avec la commande 'date' Linux, je peux utiliser une chaîne de format comme suit: "date +% F_% T%: z"

$ date +%F_%T%:z 
2017-06-29_16:13:29-07:00 

Utilisé avec time.strftime python, le% : z ne semble pas être pris en charge.

$ python 
>>> import time 
>>> print time.strftime("%F %T%:z") 
2017-06-29 16:16:15%:z 

Apparemment, '% z' est supporté, mais '%: Z' est pas:

>>> print time.strftime("%F %T%z") 
2017-05-29 16:15:35-0700 

RFC3339 utilise spécifiquement le décalage horaire avec le côlon intégré. Ce serait 07:00 dans mon cas, au lieu de 0700.

Je crois que l'omission de la prise en charge de l'option "%: z 'est due à l'implémentation C sous-jacente de strftime() ne supportant pas les versions de timezone Ceci est '%: z', '% :: z', etc.

Y at-il une solution de contournement pour cela (par exemple un autre module python, ou une option qui me manque dans le 'temps' module), autre que l'écriture de code pour obtenir% z de sortie et reformatez-le au format%: z, pour résoudre ce problème?

EDIT: Une autre question (Generate RFC 3339 timestamp in Python) donne des solutions pour d'autres modules qui peuvent être utilisés pour sortir la sortie RFC3339 . Je suis aller J'essaie de répondre moi-même avec les informations que j'ai trouvées pour la question dans le titre.

+0

Copie possible de [Générer l'horodatage RFC 3339 en Python] (https://stackoverflow.com/questions/8556398/generate-rfc-3339-timestamp-in-python) – viraptor

+0

Il existe un [ RFC3339] (https://pypi.python.org/pypi/rfc3339) module sur PyPI qui pourrait faire ce que vous voulez. – Eric

Répondre

1

La réponse stricte à la question dans le titre "Est-ce que python time.strftime traite correctement les options de fuseau horaire (pour RFC3339)?" La commande "%: z" prise en charge par la commande Linux "date" est une extension GNU et n'est pas dans la spécification POSIX ni dans l'implémentation C de strftime (à ce jour). En ce qui concerne les solutions de contournement (demandées dans le corps de la question), les réponses dans Generate RFC 3339 timestamp in Python peuvent être utilisées comme alternatives time.strftime pour sortir le logiciel compatible RFC3339. Plus précisément, j'ai utilisé le module pytz pour obtenir des informations de fuseau horaire, et la fonction isoformat() datetime class pour imprimer au format compatible RFC3339 (avec deux points dans la partie offset de la sortie timezone). Comme ceci: (dans le python 2.7 sur Ubuntu 14,04)

>>> import pytz, datetime 
>>> latz = pytz.timezone("America/Los_Angeles") 
>>> latz 
<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD> 
>>> dt = datetime.datetime.now(latz) 
>>> dt2 = datetime.datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, latz) 
>>> dt2.isoformat() 
'2017-07-06T11:50:07-08:00' 

Notez la conversion de dt à dt2, pour définir microsecondes à 0. Cela permet d'éviter isoformat de microsecondes d'impression comme une partie décimale de secondes dans la sortie de isoformat (RFC3339 ne prend pas en charge)