Converti l'oggetto datetime in una stringa di data solo in Python


282

Vedo molto sulla conversione di una stringa di date in un datetimeoggetto in Python, ma voglio andare dall'altra parte.
Ho avuto

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

e vorrei convertirlo in stringa come '2/23/2012'.

Risposte:


488

Puoi utilizzare strftime per aiutarti a formattare la data.

Per esempio,

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

produrrà:

'02/23/2012'

Maggiori informazioni sulla formattazione vedi qui


6
Molto utile per DateTimeFieldo DateFieldin django. Grazie
erajuan,

3
utilizzare t = datetime.datetime.now()per utilizzare la data corrente
gizzmole

Per quanto ne so dai documenti, non c'è modo di restituire una data imbottita diversa da zero, ovvero "23/02/2012".
Ron Kalian,

183

datee gli datetimeoggetti (e timepure) supportano un mini-linguaggio per specificare l'output , e ci sono due modi per accedervi:

  • Metodo di chiamata diretta: dt.strftime('format here'); e
  • nuovo metodo di formato: '{:format here}'.format(dt)

Quindi il tuo esempio potrebbe apparire come:

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

o

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

Per completezza: puoi anche accedere direttamente agli attributi dell'oggetto, ma poi ottieni solo i numeri:

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

Ne vale la pena il tempo impiegato per imparare la mini-lingua.


Per riferimento, ecco i codici utilizzati nella mini lingua:

  • %a Weekday come nome abbreviato della locale.
  • %A Weekday come nome completo della locale.
  • %w Giorno della settimana come un numero decimale, dove 0 è domenica e 6 è sabato.
  • %d Giorno del mese come numero decimale con riempimento zero.
  • %b Mese come nome abbreviato della locale.
  • %B Mese come nome completo della locale.
  • %m Mese come numero decimale con riempimento zero. 01, ..., 12
  • %y Anno senza secolo come un numero decimale con spaziatura zero. 00, ..., 99
  • %Y Anno con secolo come un numero decimale. 1970, 1988, 2001, 2013
  • %H Ora (orologio a 24 ore) come numero decimale con spaziatura zero. 00, ..., 23
  • %I Ora (orologio a 12 ore) come numero decimale con spaziatura zero. 01, ..., 12
  • %p Equivalente di Locale di AM o PM.
  • %M Minuto come numero decimale con spaziatura zero. 00, ..., 59
  • %S Secondo come numero decimale con spaziatura zero. 00, ..., 59
  • %f Microsecondo come un numero decimale, con spaziatura zero a sinistra. 000000, ..., 999999
  • %z Offset UTC nel formato + HHMM o -HHMM (vuoto se ingenuo), +0000, -0400, +1030
  • %Z Nome del fuso orario (vuoto se ingenuo), UTC, EST, CST
  • %j Giorno dell'anno come un numero decimale con spaziatura zero. 001, ..., 366
  • %U Numero della settimana dell'anno (domenica è il primo) come numero decimale con riempimento zero.
  • %W Numero della settimana dell'anno (il lunedì è il primo) come numero decimale.
  • %c Rappresentazione della data e dell'ora appropriate della locale.
  • %x Rappresentazione della data appropriata della locale.
  • %X Rappresentazione temporale appropriata della locale.
  • %% Un carattere letterale '%'.

29

Un'altra opzione:

import datetime
now=datetime.datetime.now()
now.isoformat()
# ouptut --> '2016-03-09T08:18:20.860968'

Sebbene la domanda riguardi il "solo appuntamento", sono venuto per ^ questo, quindi grazie. Inoltre, per ottenere una stringa un po 'più umana: datetime.datetime.now().ctime()==>'Wed Sep 4 13:12:39 2019'
Denis

13

È possibile utilizzare semplici metodi di formattazione delle stringhe:

>>> 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'

3
allo stesso modo, puoi fare qualcosa del genere '{:%Y-%m-%d %H:%M}'.format(datetime(2001, 2, 3, 4, 5)). Vedi di più su pyformat.info
mway


5

Se stai cercando un modo semplice datetimeper convertire le stringhe e puoi ometterne il formato. È possibile convertire l' datetimeoggetto in stre quindi utilizzare la suddivisione in array.

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'

Ma nota la seguente cosa. Se altre soluzioni aumenteranno AttributeErrorquando una variabile è Nonein questo caso, riceverai una 'None'stringa.

In [9]: str(None)[:19]
Out[9]: 'None'

3

È possibile convertire un oggetto datetime in una stringa lavorando direttamente con i componenti dell'oggetto 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)  

Uscita -> 23/05/2017


2

È possibile convertire datetime in stringa.

published_at = "{}".format(self.published_at)

2

La concatenazione di stringhe str.join, può essere utilizzata per creare la stringa.

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

1

Se vuoi anche il tempo, basta andare con

datetime.datetime.now().__str__()

Stampe 2019-07-11 19:36:31.118766in console per me

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.