Python datetime à chaîne sans composant microseconde


410

J'ajoute des chaînes de temps UTC aux réponses de l'API Bitbucket qui ne contiennent actuellement que des chaînes de temps Amsterdam (!). Par souci de 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 ce n'est pas pertinent).

Quelle est la meilleure façon de créer une telle chaîne ( sans composant microseconde) à partir d'une datetimeinstance avec un composant microseconde?

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

J'ajouterai la meilleure option qui m'est venue comme réponse possible, mais il pourrait bien y avoir une solution plus élégante.

Edit: Je dois mentionner que je ne suis pas fait imprimer l'heure actuelle - je datetime.nowdonner un exemple rapide. La solution ne doit donc pas supposer que toutes les datetimeinstances qu'elle recevra incluront des composants en microsecondes.

Réponses:


840

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

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

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


10
Un collègue vient de prouver de façon convaincante que c'est la bonne approche. Considérez-moi convaincu.
davidchambers

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

13
@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 devez être explicite sur cette intention. Le code dans cette réponse dit "prenez l'heure actuelle et formatez-la exactement comme ceci". Le code dans l'autre réponse dit "prenez l'heure actuelle, définissez les microsecondes à 0, puis convertissez-la en une chaîne"
Sven Marnach

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

2
@DylanYoung L'obligation de l'OP est d'imprimer un objet datetime dans un format différent du format standard renvoyé par .isoformat(), qui inclut les microsecondes par défaut. Si c'est ce dont vous avez besoin, soyez explicite. Tout le monde comprendra immédiatement ce que fait ce code. Presque personne ne comprendra l'autre code sans consulter la documentation.
Sven Marnach

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


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

1
C'est la meilleure réponse!
Havok

Bien mieux que de formater ou d'analyser des chaînes pour la comparaison, merci.
Zach Young

69

En Python 3.6:

from datetime import datetime
datetime.datetime.now().isoformat(' ', 'seconds')
'2017-01-11 14:41:33'

https://docs.python.org/3.6/library/datetime.html#datetime.datetime.isoformat


4
Je pense que maintenant, 8 ans plus tard avec l'avènement de Python 3.6, cela devrait être la réponse universelle acceptée. Cela offre le meilleur des deux mondes discuté par @DylanYoung et AlexanderMP sur ce même sujet ici
pfabri


47

C'est ainsi que je le fais. Format ISO:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
# Returns: '2017-01-23T14:58:07'

Vous pouvez remplacer le «T» si vous ne souhaitez pas le format ISO:

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'

Ceci est similaire à ma réponse. Y at - il une raison de favoriser .isoformat()plus unicode()?
davidchambers

1
Dépend de ce que vous voulez, si vous voulez utiliser la représentation de chaîne en python unicode(), et si vous voulez ISO-8601, utilisezisoformat()
radtek

Je vois. unicode()est plus pratique que .isoformat().replace('T', ' '), certainement. ;)
davidchambers

Je voudrais simplement utiliser la solution de Sven pour le format non iso, son plus explicite: datetime.now (). Strftime ("% Y-% m-% d% H:% M"), mais remplacer le 'T' est juste une autre façon. Peut être la meilleure solution si vous avez besoin à la fois d'une date ISO et d'unicode.
radtek

isoformataccepte le spécificateur de séparateur, donc aucun remplacement ne doit être effectué. il suffit de faire:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya

17

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'

Votez parce que l'OP a demandé l'heure et non l'heure.
Jürgen A. Erhard

15

Gardez les 19 premiers caractères que vous vouliez via le découpage:

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

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

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

après une année 10000, une seconde sera manquée
diti

le temps nous le dira @diti;)
yǝsʞǝla

8

Je fais habituellement:

import datetime
now = datetime.datetime.now()
now = now.replace(microsecond=0)  # To print now without microsecond.

# To print now:
print(now)

production:

2019-01-13 14:40:28

7

Étant donné que toutes les datetime.datetimeinstances n'ont pas un composant microseconde (c'est-à-dire quand il est nul), vous pouvez partitionner la chaîne sur un "." et prenez uniquement le premier élément, qui fonctionnera toujours:

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

3

Nous pouvons essayer quelque chose comme ci-dessous

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]

Ceci est inférieur à .isoformat(' ', 'seconds'), proposé dans une réponse précédente.
davidchambers

1
Lorsque j'essaie la réponse précédente proposée ci-dessus, j'obtiens en dessous de l'erreur >>> datetime.datetime.now (). Isoformat ('', 'seconds') Traceback (dernier appel le plus récent): Fichier "<stdin>", ligne 1, dans <module> TypeError: isoformat () prend au plus 1 argument (2 donné)
Abhishek Bajaj

Ah, je vois. Cela fonctionne pour moi en Python 3 mais pas en Python 2.
davidchambers

J'utilise la version python 3.4.3, en ce que je vois cette erreur. >>> datetime.datetime.now (). isoformat ('', 'seconds') Traceback (dernier appel le plus récent): Fichier "<stdin>", ligne 1, dans <module> TypeError: isoformat () prend tout au plus 1 argument (2 donnés)
Abhishek Bajaj

1

J'ai trouvé que c'était le moyen le plus simple.

>>> t = datetime.datetime.now()
>>> t
datetime.datetime(2018, 11, 30, 17, 21, 26, 606191)
>>> t = str(t).split('.')
>>> t
['2018-11-30 17:21:26', '606191']
>>> t = t[0]
>>> t
'2018-11-30 17:21:26'
>>> 

datetime.datetime.now (). strftime ("% Y-% m-% d% H:% M:% S") '2011-11-03 18:21:26' imo beaucoup plus facile. Mais facile n'est pas toujours le meilleur
An0n

1

J'utilise cela parce que je peux comprendre et donc mieux m'en souvenir (et le format de la date et de l'heure peut également être personnalisé en fonction de votre choix): -

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))

Brillant. Simple, flexible et indépendant de la plateforme (contrairement au strftime).
Endre Both le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.