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.

davidchambers
la source

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.

Sven Marnach
la source
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
davidchambers
la source
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

codeif
la source
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'
radtek
la source
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'
Andrew Clark
la source
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'
Steven Rumbalski
la source
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
An0n
la source
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]
Austin Marshall
la source
3

Nous pouvons essayer quelque chose comme ci-dessous

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]
Abhishek Bajaj
la source
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'
>>> 
Muhammed Irfan
la source
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))
satyakam shashwat
la source
Brillant. Simple, flexible et indépendant de la plateforme (contrairement au strftime).
Endre Both le