2015-09-17 1 views
3

J'essaie de sérialiser le datetime dans une API, mais je ne veux pas de millisecondes. Ce que je veux est ici: https://en.wikipedia.org/wiki/ISO_8601 - "2015-09-14T17:51:31+00:00"Impression de datetime au format ISO sans millisecondes

tz = pytz.timezone('Asia/Taipei') 
dt = datetime.datetime.now() 
loc_dt = tz.localize(dt) 

Essayez A:

loc_dt.isoformat() 
>> '2015-09-17T10:46:15.767000+08:00' 

Essayez B:

loc_dt.strftime("%Y-%m-%dT%H:%M:%S%z") 
>> '2015-09-17T10:46:15+0800' 

Ce dernier on est presque parfait sauf qu'il manque le côlon dans le fuseau horaire partie. Comment puis-je résoudre ceci sans manipulation de chaîne (suppression de millisecondes ou ajout de deux-points)?

+0

Je préfère une solution de chaîne de format, parce que ce que je peux facilement plop dans la sérialiseur. Cependant, je ne vois rien d'utile sur la page de chaîne de format de strftime. –

+0

ISO8601 permet des seconds fragments. Essayez de supprimer le fragment avant de formater la chaîne –

+0

sans rapport: votre code peut échouer lors des transitions DST, utilisez 'loc_dt = datetime.now (tz)' à la place. – jfs

Répondre

4

Vous pouvez remplacer les microsecondes avec 0 et utiliser isoformat:

import pytz 
from datetime import datetime 
tz = pytz.timezone('Asia/Taipei') 
dt = datetime.now() 
loc_dt = tz.localize(dt).replace(microsecond=0) 
print loc_dt.isoformat() 
2015-09-17T19:12:33+08:00 

Si vous voulez garder loc_dt tout comme faire le remplacement lorsque vous sortie:

loc_dt = tz.localize(dt) 
print loc_dt.replace(microsecond=0).isoformat() 

Comme commenté vous seriez mieux passer le tz-datetime.now:

dt = datetime.now(tz) 

Les raisons sont discutées dans pep-0495, vous pouvez également ajouter un assert pour attraper des insectes lorsque vous faites le remplacer:

ssert loc_dt.resolution >= timedelta(microsecond=0) 
+1

Wow , c'est bizarre du point de vue de l'analyseur. Si la microseconde est 0 pour une raison quelconque, il est omis de former complètement la sortie? Si la minute ou la seconde est nulle, elle n'est pas omise. –

+0

oui, si vous remplacez les millisecondes par 0 alors votre datetime deviendra 'datetime.datetime (2015, 9, 17, 12, 33, 46, tzinfo = ) 'donc appeler isoformat fonctionne seulement avec ce qui est là –

+2

Analyse: https://stackoverflow.com/questions/127803/how-to-parse-an-iso-8601-formatted-date-in-python Incroyable !!! –