Python datetime zum String ohne Mikrosekundenkomponente

410

Ich füge UTC-Zeitzeichenfolgen zu Bitbucket-API-Antworten hinzu, die derzeit nur Amsterdamer (!) Zeitzeichenfolgen enthalten. Aus Gründen der Konsistenz mit den an anderer Stelle zurückgegebenen UTC-Zeitzeichenfolgen ist das gewünschte Format 2011-11-03 11:07:04(gefolgt von +00:00, aber das ist nicht von Belang).

Was ist der beste Weg, um eine solche Zeichenfolge ( ohne Mikrosekundenkomponente) aus einer datetimeInstanz mit einer Mikrosekundenkomponente zu erstellen ?

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

Ich werde die beste Option, die mir in den Sinn gekommen ist, als mögliche Antwort hinzufügen, aber es kann durchaus eine elegantere Lösung geben.

Edit: Ich sollte erwähnen , dass ich nicht wirklich die aktuelle Zeit Druck - habe ich datetime.nowein kurzes Beispiel zur Verfügung zu stellen. Die Lösung sollte daher nicht davon ausgehen, dass datetimeempfangene Instanzen Mikrosekunden-Komponenten enthalten.

Davidkammern
quelle

Antworten:

839

Wenn Sie ein datetimeObjekt in einem bestimmten Format formatieren möchten, das sich vom Standardformat unterscheidet, geben Sie dieses Format am besten explizit an:

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

In der Dokumentation von finden Siedatetime.strftime() eine Erläuterung der %Richtlinien.

Sven Marnach
quelle
10
Ein Kollege hat gerade überzeugend dafür plädiert, dass dies der richtige Ansatz ist. Betrachten Sie mich als überzeugt.
Davidchambers
3
Was war dieser überzeugende Fall - diese Lösung mit datetime.replace über Ihre Lösung zu stellen?
Matlehmann
13
@matlehmann: Natürlich kenne ich die Argumente des Kollegen von davidchambers nicht. Ich denke jedoch, wenn Sie beabsichtigen, ein Datum in einem ganz bestimmten Format zu drucken, sollten Sie diese Absicht ausdrücklich erläutern. Der Code in dieser Antwort lautet "Nehmen Sie die aktuelle Zeit und formatieren Sie sie genau so". Der Code in der anderen Antwort lautet "Nehmen Sie die aktuelle Zeit, setzen Sie die Mikrosekunden auf 0 und konvertieren Sie sie dann irgendwie in eine Zeichenfolge".
Sven Marnach
3
+1, explizite Angaben zum Zeichenfolgenformat vermeiden Probleme, wenn sich die Standardkonvertierung von datetime-str in einer zukünftigen Python-Version ändert
Alan Evangelista
2
@DylanYoung Die Anforderung des OP besteht darin, ein Datum / Uhrzeit-Objekt in einem Format zu drucken, das sich von dem von zurückgegebenen Standardformat unterscheidet, das standardmäßig .isoformat()die Mikrosekunden enthält. Wenn es das ist, was Sie brauchen, seien Sie explizit darüber. Jeder wird sofort verstehen, was dieser Code tut. Kaum jemand wird den anderen Code verstehen, ohne die Dokumentation zu lesen.
Sven Marnach
172
>>> import datetime
>>> now = datetime.datetime.now()
>>> print unicode(now.replace(microsecond=0))
2011-11-03 11:19:07
Davidkammern
quelle
1
In meiner Situation wurde das Datum bereits erstellt und ich musste es auf die Sekunde "festsetzen". das ist perfekt, danke.
Vigrond
1
Das ist die beste Antwort!
Havok
Weitaus besser als das Formatieren oder Parsen von Zeichenfolgen für den Vergleich, danke.
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

Codeif
quelle
4
Ich denke, jetzt, 8 Jahre später mit dem Aufkommen von Python 3.6, sollte dies die akzeptierte, universelle Antwort sein. Dies bietet das Bessere aus beiden Welten, über das @DylanYoung und AlexanderMP in demselben Thread hier
gestritten
47

So mache ich es. ISO-Format:

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

Sie können das 'T' ersetzen, wenn Sie kein ISO-Format wünschen:

datetime.datetime.now().replace(microsecond=0).isoformat(' ')
# Returns: '2017-01-23 15:05:27'
radtek
quelle
Dies ähnelt meiner Antwort. Gibt es einen Grund zu begünstigen .isoformat()über unicode()?
Davidchambers
1
Hängt davon ab, was Sie wollen, wenn Sie die Python-String-Darstellung verwenden unicode()möchten, und wenn Sie ISO-8601 möchten, verwenden Sieisoformat()
radtek
Aha. unicode()ist bequemer als .isoformat().replace('T', ' ')sicherlich. ;)
Davidchambers
Ich würde nur die Lösung von Sven für das Nicht-ISO-Format verwenden, das expliziter ist: datetime.now (). Strftime ("% Y-% m-% d% H:% M"), aber das Ersetzen des 'T' ist nur ein anderes Weg. Kann die beste Lösung sein, wenn Sie sowohl ISO- als auch Unicode-Datum benötigen.
Radtek
isoformatAkzeptiert den Trennzeichenspezifizierer, daher sollte kein Ersetzen durchgeführt werden. tun Sie einfach:datetime.datetime.now().replace(microsecond=0).isoformat(' ')
coya
17

Noch eine Option:

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

Standardmäßig wird die Ortszeit verwendet. Wenn Sie UTC benötigen, können Sie Folgendes verwenden:

>>> time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
'2011-11-03 18:32:20'
Andrew Clark
quelle
Downvote, weil das OP nach Datum und Uhrzeit gefragt hat, nicht nach Uhrzeit.
Jürgen A. Erhard
15

Behalten Sie die ersten 19 Zeichen, die Sie wollten, per Slicing:

>>> str(datetime.datetime.now())[:19]
'2011-11-03 14:37:50'
Steven Rumbalski
quelle
5
Dies ist nur deshalb falsch, weil an Zeitzeichenfolgen eine Zeitzonenspezifikation angehängt werden kann, z +05:30. Richtig wäre str(now())[:19].
K3 --- rnc
1
@ K3 --- rnc: Danke. Aktualisiert gemäß Ihrem Vorschlag.
Steven Rumbalski
Nach einem Jahr 10000wird eine Sekunde verpasst
am
Die Zeit wird es @diti zeigen;)
yǝsʞǝla
8

Normalerweise mache ich:

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

# To print now:
print(now)

Ausgabe:

2019-01-13 14:40:28
An0n
quelle
7

Da nicht alle datetime.datetimeInstanzen eine Mikrosekundenkomponente haben (dh wenn sie Null ist), können Sie die Zeichenfolge auf einem "partitionieren". und nimm nur den ersten Gegenstand, der immer funktioniert:

unicode(datetime.datetime.now()).partition('.')[0]
Austin Marshall
quelle
3

Wir können so etwas wie unten versuchen

import datetime

date_generated = datetime.datetime.now()
date_generated.replace(microsecond=0).isoformat(' ').partition('+')[0]
Abhishek Bajaj
quelle
Dies ist schlechter als .isoformat(' ', 'seconds')in einer früheren Antwort vorgeschlagen.
Davidchambers
1
Wenn ich die oben vorgeschlagene frühere Antwort versuche, wird der folgende Fehler angezeigt >>> datetime.datetime.now (). Isoformat ('', 'Sekunden') Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <Modul> TypeError: isoformat () nimmt höchstens 1 Argument (2 angegeben)
Abhishek Bajaj
Ah ich sehe. Es funktioniert für mich in Python 3, aber nicht in Python 2.
Davidchambers
Ich benutze Python 3.4.3 Version, in der ich diesen Fehler sehe. >>> datetime.datetime.now (). isoformat ('', 'Sekunden') Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> TypeError: isoformat () dauert höchstens 1 Argument (2 gegeben)
Abhishek Bajaj
1

Ich fand das der einfachste Weg.

>>> 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
quelle
datetime.datetime.now (). strftime ("% Y-% m-% d% H:% M:% S") '2011-11-03 18:21:26' viel einfacher imo. Aber einfach ist nicht immer das Beste
An0n
1

Dies verwende ich, weil ich es besser verstehen und mich daher besser daran erinnern kann (und das Datums- und Uhrzeitformat kann auch nach Ihrer Wahl angepasst werden): -

import datetime
moment = datetime.datetime.now()
print("{}/{}/{} {}:{}:{}".format(moment.day, moment.month, moment.year,
                                 moment.hour, moment.minute, moment.second))
Satyakam Shashwat
quelle
Brillant. Einfach, flexibel und plattformunabhängig (im Gegensatz zu strftime).
Endre Both