2011-08-30 4 views
2

Ok, donc je convertir des chaînes à ce jour à ce jour par:Chaîne à datetime format de la variable

datetime.datetime.fromtimestamp(time.mktime(time.strptime(date_string, DB_TIME_FORMAT))) 

Mais j'obtenir des résultats étranges. Par exemple, pour:

date_string = '2011-08-30 12:52:57.573979' 
DB_TIME_FORMAT = '%Y-%m-%d %H:%M:%S.%f' 

Le résultat est:

2011-08-30 12:52:57 

donc je suppose que ma première question est-ce que les millisecondes où aller?

Ma deuxième question serait de savoir s'il existe un moyen de convertir une chaîne "dynamique" en une conversion temporelle? Par ceci je veux dire, disons pour le format dans mon exemple précédent, si les millisecondes ne sont pas présentes, au lieu d'obtenir un ValueError si retournera toujours une date normale. Si les secondes manquent la même situation et ainsi de suite?

salutations, Bogdan

+0

Je suppose qu'il pourrait être perdu avec mktime, qui devrait retourner l'horodatage unix en secondes depuis le 1/1/1970. En fait fromtimestamp attend ce type d'horodatage. – Teudimundo

+0

'.573979' - ressemble à des microsecondes et non à des millisecondes. – eumiro

Répondre

2

vous manque les millisecondes parce strptime retourne un time tuple, qui n'a pas de champ millisecondes et secondes stocke sous forme d'entier. À partir de ce moment, vos résultats manquent les millisecondes. La bonne façon d'obtenir millisecondes est d'utiliser le strptime du module datetime, comme ceci:

parsed = datetime.datetime.strptime(date_string, DB_TIME_FORMAT) 

Cela simplifie également votre solution, car il semble que vous voulez finir avec un datetime de toute façon.

En ce qui concerne la relaxation dans le format accepté, ce n'est pas facile en Python; ses modules date/heure n'ont pas de "détection automatique" comme c'est le cas pour certaines langues. Sans utiliser de bibliothèques tierces, je pense que vous feriez mieux d'attraper les exceptions et de réessayer avec un format différent. Par exemple:

from datetime import datetime 
try: parsed = datetime.strptime(date_string, DB_TIME_FORMAT) 
except ValueError: 
    parsed = datetime.strptime(date_string, DB_TIME_FORMAT_WITHOUT_MILLISECONDS) 

Et vous pouvez ajouter des niveaux supplémentaires pour les secondes manquantes et ainsi de suite.

+0

Merci, je ne me souviens pas vraiment pourquoi je voulais l'horodatage en premier lieu. – Bogdan