Convertir un objet datetime en une chaîne de date uniquement en Python

282

Je vois beaucoup de choses sur la conversion d'une chaîne de date en un datetimeobjet en Python, mais je veux aller dans l'autre sens.
j'ai

datetime.datetime(2012, 2, 23, 0, 0)

et je voudrais le convertir en chaîne comme '2/23/2012'.

wilbev
la source

Réponses:

489

Vous pouvez utiliser strftime pour vous aider à formater votre date.

Par exemple,

import datetime
t = datetime.datetime(2012, 2, 23, 0, 0)
t.strftime('%m/%d/%Y')

donnera:

'02/23/2012'

Plus d'informations sur le formatage voir ici

Levon
la source
6
Très utile pour DateTimeFieldou DateFielddans Django. Merci
erajuan
3
utiliser t = datetime.datetime.now()pour utiliser la date actuelle
gizzmole
Pour autant que je sache à partir des documents, il n'y a aucun moyen de renvoyer une date remplie non nulle, c'est-à-dire '23/02/2012'.
Ron Kalian
183

dateet les datetimeobjets (et timeaussi) prennent en charge un mini-langage pour spécifier la sortie , et il y a deux façons d'y accéder:

  • appel de méthode directe: dt.strftime('format here'); et
  • nouvelle méthode de formatage: '{:format here}'.format(dt)

Ainsi, votre exemple pourrait ressembler à:

dt.strftime('%m/%d/%Y')

ou

'{:%m/%d/%Y}'.format(dt)

Par souci d'exhaustivité: vous pouvez également accéder directement aux attributs de l'objet, mais vous n'obtenez alors que les chiffres:

'%s/%s/%s' % (dt.month, dt.day, dt.year)

Le temps pris pour apprendre la mini-langue en vaut la peine.


Pour référence, voici les codes utilisés dans le mini-langage:

  • %a Jour de semaine comme nom abrégé des paramètres régionaux.
  • %A Jour de semaine comme nom complet de la locale.
  • %w Jour de la semaine sous forme décimale, où 0 correspond au dimanche et 6 au samedi.
  • %d Jour du mois sous forme de nombre décimal avec un zéro.
  • %b Mois comme nom abrégé des paramètres régionaux.
  • %B Mois comme nom complet de la locale.
  • %m Mois sous forme de nombre décimal avec un zéro. 01, ..., 12
  • %y Année sans siècle sous forme de nombre décimal à remplissage zéro. 00, ..., 99
  • %Y Année avec siècle comme nombre décimal. 1970, 1988, 2001, 2013
  • %H Heure (horloge de 24 heures) sous forme de nombre décimal à zéro. 00, ..., 23
  • %I Heure (horloge de 12 heures) sous forme de nombre décimal à zéro. 01, ..., 12
  • %p Équivalent des paramètres régionaux AM ou PM.
  • %M Minute sous forme de nombre décimal à remplissage zéro. 00, ..., 59
  • %S Deuxième en tant que nombre décimal à remplissage zéro. 00, ..., 59
  • %f La microseconde en nombre décimal, complétée par un zéro à gauche. 000000, ..., 999999
  • %z Décalage UTC sous la forme + HHMM ou -HHMM (vide si naïf), +0000, -0400, +1030
  • %Z Nom du fuseau horaire (vide si naïf), UTC, EST, CST
  • %j Jour de l'année sous forme de nombre décimal à remplissage zéro. 001, ..., 366
  • %U Numéro de semaine de l'année (le dimanche est le premier) sous forme de nombre décimal avec un zéro.
  • %W Numéro de semaine de l'année (le lundi est le premier) sous forme de nombre décimal.
  • %c Représentation appropriée de la date et de l'heure des paramètres régionaux.
  • %x Représentation de date appropriée des paramètres régionaux.
  • %X Représentation temporelle appropriée des paramètres régionaux.
  • %% Un caractère '%' littéral.
Ethan Furman
la source
29

Une autre option:

import datetime
now=datetime.datetime.now()
now.isoformat()
# ouptut --> '2016-03-09T08:18:20.860968'
Paul Joireman
la source
Bien que la question concerne l'obtention de "date seulement", je suis venu pour ^ ceci, alors merci. Aussi, pour obtenir une chaîne un peu plus humaine: datetime.datetime.now().ctime()==>'Wed Sep 4 13:12:39 2019'
Denis
13

Vous pouvez utiliser des méthodes de formatage de chaîne simples:

>>> dt = datetime.datetime(2012, 2, 23, 0, 0)
>>> '{0.month}/{0.day}/{0.year}'.format(dt)
'2/23/2012'
>>> '%s/%s/%s' % (dt.month, dt.day, dt.year)
'2/23/2012'
juliomalegria
la source
3
de même, vous pouvez faire quelque chose comme '{:%Y-%m-%d %H:%M}'.format(datetime(2001, 2, 3, 4, 5)). Voir plus sur pyformat.info
mway
10

type-specific formatting peut également être utilisé:

t = datetime.datetime(2012, 2, 23, 0, 0)
"{:%m/%d/%Y}".format(t)

Production:

'02/23/2012'
midori
la source
5

Si vous cherchez un moyen simple de datetimeconvertir la chaîne et que vous pouvez omettre le format. Vous pouvez convertir un datetimeobjet en str, puis utiliser le découpage de tableau.

In [1]: from datetime import datetime

In [2]: now = datetime.now()

In [3]: str(now)
Out[3]: '2019-04-26 18:03:50.941332'

In [5]: str(now)[:10]
Out[5]: '2019-04-26'

In [6]: str(now)[:19]
Out[6]: '2019-04-26 18:03:50'

Mais notez la chose suivante. Si d'autres solutions augmentent AttributeErrorlorsque la variable est Nonedans ce cas, vous recevrez une 'None'chaîne.

In [9]: str(None)[:19]
Out[9]: 'None'
Daniil Mashkin
la source
3

Il est possible de convertir un objet datetime en chaîne en travaillant directement avec les composants de l'objet datetime.

from datetime import date  

myDate = date.today()    
#print(myDate) would output 2017-05-23 because that is today
#reassign the myDate variable to myDate = myDate.month 
#then you could print(myDate.month) and you would get 5 as an integer
dateStr = str(myDate.month)+ "/" + str(myDate.day) + "/" + str(myDate.year)    
# myDate.month is equal to 5 as an integer, i use str() to change it to a 
# string I add(+)the "/" so now I have "5/" then myDate.day is 23 as
# an integer i change it to a string with str() and it is added to the "5/"   
# to get "5/23" and then I add another "/" now we have "5/23/" next is the 
# year which is 2017 as an integer, I use the function str() to change it to 
# a string and add it to the rest of the string.  Now we have "5/23/2017" as 
# a string. The final line prints the string.

print(dateStr)  

Sortie -> 23/05/2017

Darrell White
la source
2

Vous pouvez convertir datetime en chaîne.

published_at = "{}".format(self.published_at)
Kimsal San
la source
2

La concaténation de chaînes,, str.joinpeut être utilisée pour créer la chaîne.

d = datetime.now()
'/'.join(str(x) for x in (d.month, d.day, d.year))
'3/7/2016'
Nizam Mohamed
la source
1

Si vous voulez aussi du temps, allez-y avec

datetime.datetime.now().__str__()

Imprime 2019-07-11 19:36:31.118766dans la console pour moi

phil294
la source