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.

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.


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


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


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'

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'

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'

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

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]

3

Wir können so etwas wie unten versuchen

import datetime

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

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

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

Brillant. Einfach, flexibel und plattformunabhängig (im Gegensatz zu strftime).
Endre Both
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.