Python-Datums- / Uhrzeitformatierung ohne Null-Auffüllung

90

Gibt es ein Format zum Drucken von Python-Datumsangaben, bei dem Datums- und Uhrzeitangaben nicht mit Nullen aufgefüllt werden?

Format, das ich jetzt verwende:

mydatetime.strftime('%m/%d/%Y %I:%M%p')

Ergebnis: 29.02.2012 17:03
Gewünscht: 29.02.2012 17:03 Uhr

Welches Format würde den Monat als "2" anstelle von "02" und die Zeit als "17:03 Uhr" anstelle von "05: 03PM" darstellen?

Yarin
quelle

Antworten:

77

Die mit verfügbaren Formatierungsoptionen datetime.strftime()werden alle auf Null gesetzt. Sie können natürlich Ihre eigene Formatierungsfunktion verwenden, aber die einfachste Lösung in diesem Fall besteht darin, das Ergebnis nachzubearbeiten datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
Sven Marnach
quelle
1
Sven: Weil ich wie Facebook aussehen will. Vielen Dank!
Yarin
4
In Nordamerika verwenden nur sehr wenige Menschen gepolsterte Stunden, wenn sie die Zeit von Hand schreiben.
Eric Walker
2
Wird das nicht noch Null am Tag des Monats sein?
Richter Maygarden
1
@JudgeMaygarden: Deshalb hilft die Lösung .lstrip("0"), die führende Null loszuwerden.
Sven Marnach
1
Warum möchte ich Pad-Nullen entfernen? Weil dies durch RFC 2822 falsch ist , zum Beispiel im Podcast-Feed.
Vitaly Zdanevich
164

Die andere Alternative, um den oben genannten Null-Aspekt "alles oder nichts" zu vermeiden, besteht darin, ein Minus vor den Feldtyp zu setzen:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

Dann das: '10.10.2015 03:00 Uhr '

Wird: '10.10.2015 03:00 Uhr '

Falls gewünscht, können Sie optional ein Minus vor dem Tag platzieren.

Bearbeiten: Die Minus-Funktion stammt aus der GNU C-Bibliothek („glibc“), wie in der Linux-Strftime-Manpage unter „Glibc-Notizen“ erwähnt.

ChrisFreeman
quelle
6
Dies ist eigentlich die richtige Antwort und funktioniert in anderen Systemen (wie Matplotlib und Pandas).
Henry Schreiner
46
Tolle Antwort, aber nur Linux. Funktioniert nicht unter Windows. stackoverflow.com/questions/10807164/…
ExactaBox
1
Warum funktioniert das? Ich kann nicht einen Verweis auf diese in der Dokumentation finden date.__format__oder time.strftime, docs.python.org/3/library/... und docs.python.org/3.8/library/time.html#time.strftime bzw.
Amin Shah Gilani
1
@AminShahGilani Beitrag aktualisiert mit src Referenz
ChrisFreeman
93

Das neue Formatierungssystem für Zeichenfolgen bietet eine Alternative zu strftime. Es ist gut lesbar - in der Tat könnte es strftimeaus diesem Grund vorzuziehen sein . Ganz zu schweigen von der Tatsache, dass es kein Zero-Pad gibt:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

Da Sie wahrscheinlich keine Auffüllung im Minutenfeld wünschen, können Sie dies tun:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

Wenn Sie "reguläre" Zeit anstelle von "militärischer" Zeit wünschen, können Sie auch weiterhin die Standardspezifizierer verwenden strftime. Für unsere Zwecke strftime wird zweckmäßigerweise ein Code für die 12-Stunden-Zeit bereitgestellt, der mit einem Leerzeichen anstelle einer führenden Null aufgefüllt ist:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

Dies wird leider etwas weniger lesbar. Und wie @mlissner betont, strftimewird es auf einigen (allen?) Plattformen für Daten vor 1900 fehlschlagen.

senderle
quelle
1
Es gibt es seit Python 2.6. (Es ist nicht so neu.)
senderle
3
Um den Monat zu buchstabieren, können Sie zum Beispiel Folgendes verwenden: "{0.day} {0:%B %Y}".format(d)was Ihnen '2 August 2013'als Tag dieses Kommentars geben würde :)
Jens
2
Das ist interessant, aber es beantwortet OP nicht wirklich, weil er AM / PM Stunden will. Ich werde es nicht wirklich ablehnen, aber die akzeptierte Antwort ist tatsächlich richtig, wenn Sie versuchen, eine "amerikanische" Datums- / Uhrzeitformatierung in Python zu erhalten.
Dana Cartwright
Beachten Sie, dass diese Technik strftime verwendet, die an Daten vor 1900 fehlschlägt. Wenn Sie alte Daten haben, werden Sie dies bereuen.
mlissner
1
fak! Ich habe gerade festgestellt, wo ich nicht auf ein anderes Objekt gezeigt habe, sondern es nur als Positionsargument übergeben habe.
JacobIRR
50

Akzeptierte Antwort keine richtige Lösung (IMHO) Die richtigen dokumentierten Methoden:

Unter Linux wird "#" durch "-" ersetzt:

% -d,% -H,% -I,% -j,% -m,% -M,% -S,% -U,% -w,% -W,% -y,% -Y

In Windows wird "-" durch "#" ersetzt:

% # d,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% # Y.

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

Quelle: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Wie von Sagneta angegeben: Der # Hash-Trick unter Windows ist nur für native ausführbare Python-Dateien verfügbar. Dies funktioniert nicht für Cygwin-basierte Python-Implementierungen.


quelle
3
Das ist richtig. Beachten Sie jedoch, dass der # Hash-Trick unter Windows nur für native ausführbare Python-Dateien verfügbar ist. Mit anderen Worten, dies funktioniert nicht bei Cygwin-basierten Python-Implementierungen.
Sagneta
2
Wow, das ist großartig zu wissen, aber ich bin entsetzt über die Konsequenz. Ich teste die von einer Datenbank zurückgegebene Datumsformatierung und muss für jeden Test die erwartete Formatierung übergeben. Dies erhöht die Komplexität erheblich.
Keith
10

Gute Antwort von Chris Freeman unter Linux.

Unter Windows ist es:

mydate.strftime('%#m/%#d/%Y')

Dachte, das könnte helfen.

user3685285
quelle
0

"% l" (das ist ein Kleinbuchstabe L) arbeitet für die Stunde (anstelle von "% I"). Ich weiß das nur aus einer anderen Antwort hier

Python strftime - Datum ohne führende 0?

Leider haben sie nicht den Code für die anderen Elemente eines Datums / einer Uhrzeit.

Rob Cranfill
quelle