534 votes

Python datetime en chaîne sans composant microseconde

Je suis en train d'ajouter des chaînes de temps UTC aux réponses de l'API de Bitbucket qui contiennent actuellement uniquement des chaînes de temps d'Amsterdam. Pour la cohérence avec les chaînes de temps UTC renvoyées ailleurs, le format souhaité est 2011-11-03 11:07:04 (suivi de +00:00, mais cela n'est pas pertinent).

Quel est le meilleur moyen de créer une telle chaîne (sans composant de microseconde) à partir d'une instance datetime avec un composant de microseconde?

>>> import datetime
>>> print unicode(datetime.datetime.now())
2011-11-03 11:13:39.278026

Je vais ajouter la meilleure option qui m'est venue en tête comme réponse possible, mais il pourrait y avoir une solution plus élégante.

Édition : Je tiens à préciser que je n'imprime pas réellement l'heure actuelle - j'ai utilisé datetime.now pour fournir un exemple rapide. Donc la solution ne doit pas supposer que les instances de datetime qu'elle reçoit incluront des composants de microseconde.

1035voto

Sven Marnach Points 133943

Si vous souhaitez formater un objet datetime dans un format spécifique différent du format standard, il est préférable de spécifier explicitement ce format :

>>> import datetime
>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 18:21:26'

Voir la documentation de datetime.strftime() pour une explication des directives %.

À partir de Python 3.6, la méthode isoformat() est suffisamment flexible pour produire également ce format :

datetime.datetime.now().isoformat(sep=" ", timespec="seconds")

3 votes

Quel était ce cas convaincant - placer cette solution au-dessus de votre solution en utilisant datetime.replace ?

15 votes

@matlehmann : Bien sûr, je ne connais pas les arguments du collègue de davidchambers. Cependant, je pense que si votre intention est d'imprimer une date dans un format très spécifique, vous devriez être explicite à ce sujet. Le code dans cette réponse dit "prendre l'heure actuelle et la formater exactement comme ceci". Le code dans l'autre réponse dit "prendre l'heure actuelle, mettre les microsecondes à 0, puis la convertir en chaîne d'une manière ou d'une autre".

3 votes

+1, en étant explicite sur le format de la chaîne évite les problèmes si la conversion standard de datetime-str change dans une future version de Python

211voto

davidchambers Points 3048
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07

21 votes

1 votes

Dans ma situation, la date a déjà été construite et j'avais besoin de la "plancher" à la seconde. C'est parfait, merci.

1 votes

C'est la meilleure réponse!

19voto

Andrew Clark Points 77748

Encore une autre option:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2011-11-03 11:31:28'

Par défaut, cela utilise l'heure locale, si vous avez besoin de l'UTC vous pouvez utiliser ce qui suit:

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'

0 votes

Voter négativement car l'OP a demandé à propos de datetime, pas de l'heure.

17voto

Steven Rumbalski Points 16838

Gardez les 19 premiers caractères que vous vouliez via slicing :

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'

5 votes

Ceci est seulement incorrect car les chaînes de temps peuvent avoir une spécification de fuseau horaire ajoutée, par exemple +05:30. Correct serait str(now())[:19].

2 votes

@K3---rnc: Merci. Mis à jour selon votre suggestion.

0 votes

Après l'année 10000, une seconde sera manquée

8voto

Austin Marshall Points 1104

Étant donné que toutes les instances de datetime.datetime n'ont pas de composante microseconde (c'est-à-dire lorsqu'elle est nulle), vous pouvez partitionner la chaîne sur un "." et prendre uniquement le premier élément, ce qui fonctionnera toujours :

unicode(datetime.datetime.now()).partition('.')[0]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X