Python datetime su stringa senza componente di microsecondi


410

Sto aggiungendo stringhe di tempo UTC alle risposte dell'API di Bitbucket che attualmente contengono solo stringhe di tempo di Amsterdam (!). Per coerenza con le stringhe temporali UTC restituite altrove, il formato desiderato è 2011-11-03 11:07:04(seguito da +00:00, ma non è germano).

Qual è il modo migliore per creare una tale stringa ( senza un componente di microsecondi) da datetimeun'istanza con un componente di microsecondi?

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

Aggiungerò l'opzione migliore che mi è venuta in mente come possibile risposta, ma potrebbe esserci una soluzione più elegante.

Modifica: dovrei menzionare che in realtà non sto stampando l'ora corrente - ho usato datetime.nowper fornire un rapido esempio. Quindi la soluzione non dovrebbe presumere che qualsiasi datetimeistanza che riceverà includerà componenti di microsecondi.

Risposte:


840

Se vuoi formattare un datetimeoggetto in un formato specifico diverso dal formato standard, è meglio specificare esplicitamente quel formato:

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

Consultare la documentazione didatetime.strftime() per una spiegazione delle %direttive.


10
Un collega ha appena fatto un caso convincente per questo approccio corretto. Considerami convinto.
davidchambers,

3
Qual è stato il caso convincente: mettere questa soluzione sopra la tua soluzione usando datetime.replace?
matlehmann,

13
@matlehmann: Ovviamente non conosco gli argomenti del collega di David. Tuttavia, penso che se la tua intenzione è quella di stampare una data in un formato molto specifico, dovresti essere esplicito su questa intenzione. Il codice in questa risposta dice "prendi l'ora corrente e formattala esattamente così". Il codice nell'altra risposta dice "prendi l'ora corrente, imposta i microsecondi a 0, e poi convertilo in una stringa in qualche modo".
Sven Marnach,

3
+1, essendo esplicito sul formato stringa evita problemi se la conversione standard datetime-str cambia in una futura versione di Python
Alan Evangelista

2
@DylanYoung Il requisito dell'OP è di stampare un oggetto datetime in un formato diverso dal formato standard restituito .isoformat(), che include i microsecondi per impostazione predefinita. Se è quello che ti serve, sii esplicito a riguardo. Tutti capiranno immediatamente cosa fa questo codice. Quasi nessuno capirà l'altro codice senza consultare la documentazione.
Sven Marnach,

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


1
nella mia situazione, la data è già stata costruita e ho dovuto "ridimensionarla" al secondo. questo è perfetto, grazie.
Vigrond,

1
Questa è la risposta migliore!
Havok,

Molto meglio della formattazione o dell'analisi delle stringhe per il confronto, grazie.
Zach Young,

69

In 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
Penso che ora, 8 anni dopo, con l'avvento di Python 3.6, questa dovrebbe essere la risposta accettata e universale. Questo offre il meglio dei due mondi discussi da @DylanYoung e AlexanderMP su questo stesso thread qui
pfabri


47

Questo è il modo in cui lo faccio. Formato ISO:

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

Puoi sostituire la "T" se non desideri il formato ISO:

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

Questo è simile alla mia risposta. C'è una ragione per favorire .isoformat()sopra unicode()?
davidchambers,

1
Dipende da ciò che si desidera, se si desidera utilizzare la rappresentazione della stringa in pitone unicode()e, se si desidera ISO-8601, utilizzareisoformat()
radtek,

Vedo. unicode()è più conveniente di .isoformat().replace('T', ' '), certamente. ;)
davidchambers,

Vorrei solo usare la soluzione di Sven per un formato non iso, è più esplicita: datetime.now (). Strftime ("% Y-% m-% d% H:% M"), ma sostituire la 'T' è solo un altro modo. Potrebbe essere la soluzione migliore se hai bisogno sia della data ISO che di quella Unicode.
Radtek,

isoformataccetta l'identificatore di separazione, quindi non è necessario effettuare la sostituzione. fai solo:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya,

17

Ancora un'altra opzione:

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

Per impostazione predefinita, utilizza l'ora locale, se è necessario UTC è possibile utilizzare quanto segue:

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

Downvote perché l'OP ha chiesto di datetime, non di tempo.
Jürgen A. Erhard,

15

Mantieni i primi 19 caratteri che volevi tramite il taglio:

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

5
Ciò non è corretto poiché alle stringhe temporali può essere aggiunta la specifica del fuso orario, ad es +05:30. Sarebbe corretto str(now())[:19].
K3 --- rnc,

1
@ K3 --- rnc: grazie. Aggiornato secondo il tuo suggerimento.
Steven Rumbalski

dopo anno 10000, un secondo non sarà raggiunto
diti

il tempo lo dirà a @diti;)
yǝsʞǝla il

8

Di solito faccio:

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

# To print now:
print(now)

produzione:

2019-01-13 14:40:28

7

Poiché non tutte le datetime.datetimeistanze hanno un componente di microsecondi (ovvero quando è zero), è possibile partizionare la stringa su un "." e prendi solo il primo oggetto, che funzionerà sempre:

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

3

Possiamo provare qualcosa di simile di seguito

import datetime

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

Ciò è inferiore .isoformat(' ', 'seconds'), proposto in una risposta precedente.
davidchambers,

1
Quando sto provando la risposta precedente proposta sopra, sto ottenendo sotto l'errore >>> datetime.datetime.now (). Isoformat ('', 'seconds') Traceback (ultima chiamata più recente): File "<stdin>", linea 1, in <modulo> TypeError: isoformat () accetta al massimo 1 argomento (2 dati)
Abhishek Bajaj

Ah, capisco. Funziona per me in Python 3 ma non in Python 2.
davidchambers

Sto usando la versione 3.4.3 di Python, in quanto vedo quell'errore. >>> datetime.datetime.now (). isoformat ('', 'seconds') Traceback (ultima chiamata più recente): file "<stdin>", riga 1, in <modulo> TypeError: isoformat () impiega al massimo 1 argomento (2 forniti)
Abhishek Bajaj

1

Ho trovato che questo è il modo più semplice.

>>> 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 molto più facile. Ma facile non è sempre il migliore
An0n

1

Questo lo uso perché posso capire e quindi ricordarlo meglio (e anche il formato data e ora può essere personalizzato in base alla tua scelta): -

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

Brillante. Semplice, flessibile e indipendente dalla piattaforma (a differenza dello strftime).
Endre Entrambi
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.