Formatowanie datetime w Pythonie bez uzupełniania zerami

90

Czy istnieje format drukowania dat w języku Python, który nie będzie używał uzupełniania zerami w datach i godzinach?

Format, którego teraz używam:

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

Wynik: 2012-02-29, 17:03
Oczekiwany: 2012-02-29, 17:03

Jaki format przedstawiałby miesiąc jako „2” zamiast „02”, a czas jako „17:03” zamiast „05: 15”

Yarin
źródło

Odpowiedzi:

77

Wszystkie opcje formatowania dostępne w datetime.strftime()will zero-pad. Możesz oczywiście rozwinąć własną funkcję formatowania, ale najłatwiejszym rozwiązaniem w tym przypadku może być przetwarzanie końcowe wyniku datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
Sven Marnach
źródło
1
Sven- Ponieważ chcę wyglądać jak Facebook. Dzięki!
Yarin
4
Bardzo niewiele osób w Ameryce Północnej używa godzin z zerową czcionką do ręcznego wpisywania czasu.
Eric Walker
2
Czy to nadal nie będzie padać zera w dniu miesiąca?
Sędzia Maygarden
1
@JudgeMaygarden: Dlatego rozwiązaniem jest .lstrip("0")pozbycie się wiodącego zera.
Sven Marnach
1
Dlaczego chcę usunąć zera? Ponieważ jest to błędne w RFC 2822 , na przykład w kanale podcastów.
Witalij Zdanevich
165

Innym rozwiązaniem pozwalającym uniknąć powyższego aspektu wiodącego zera „wszystko albo nic” jest umieszczenie minusa przed typem pola:

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

Następnie: „4/10/2015 03:00 AM”

Staje się: „4/10/2015 3:00 AM”

Jeśli chcesz, możesz opcjonalnie umieścić minus przed dniem.

Edycja: funkcja minus pochodzi z biblioteki GNU C („glibc”), jak wspomniano na stronie podręcznika Linux strftime w sekcji „Notatki Glibc”

ChrisFreeman
źródło
48
Świetna odpowiedź, ale tylko Linux. Nie będzie działać w systemie Windows. stackoverflow.com/questions/10807164/…
ExactaBox
1
Dlaczego to działa? Nie mogę znaleźć odniesienie do tego w docs dla date.__format__lub time.strftime, docs.python.org/3/library/... i docs.python.org/3.8/library/time.html#time.strftime odpowiednio
Amin Shah Gilani
1
Post @AminShahGilani zaktualizowany o odniesienie do
źródła
93

Nowy system formatowania ciągów stanowi alternatywę dla strftime. Jest całkiem czytelny - rzeczywiście, może być lepszy niż strftimena tym koncie. Nie wspominając o tym, że nie jest to zero-pad:

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

Ponieważ prawdopodobnie potrzebujesz dopełnienia zerowego w polu minut, możesz to zrobić:

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

Jeśli chcesz mieć „zwykły” czas zamiast „wojskowego”, możesz nadal używać standardowych strftimespecyfikatorów. Wygodnie, dla naszych celów, strftime nie dostarcza kod do 12-godzinnego czasu napawa się zaślepką zamiast zerem:

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

Niestety, staje się to nieco mniej czytelne. Jak wskazuje @mlissner, strftimena niektórych (wszystkich?) Platformach zakończy się niepowodzeniem w przypadku dat sprzed 1900 r.

nadawca
źródło
1
Jest już od wersji Pythona 2.6. (To nie jest takie nowe.)
senderle
3
Na przykład, aby przeliterować miesiąc, możesz użyć następującego: "{0.day} {0:%B %Y}".format(d)co da ci '2 August 2013'jako dzień tego komentarza :)
Jens
2
To interesujące, ale tak naprawdę nie odpowiada OP, ponieważ chce godzin AM / PM. Właściwie nie zamierzam tego głosować, ale zaakceptowana odpowiedź jest w rzeczywistości poprawna, jeśli próbujesz uzyskać „amerykańskie” formatowanie daty / czasu w Pythonie.
Dana Cartwright
Zauważ, że ta technika wykorzystuje strftime, co nie powiedzie się przed 1900 rokiem. Jeśli masz stare daty, będziesz tego żałować.
mlissner
1
fałszywy! Właśnie zdałem sobie sprawę, że nie wskazałem d na inny obiekt, po prostu przekazałem go jako argument pozycyjny.
JacobIRR
50

Zaakceptowana odpowiedź nie jest właściwym rozwiązaniem (IMHO) Właściwe udokumentowane metody:

W Linuksie „#” jest zastępowane przez „-”:

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

W systemie Windows „-” jest zastępowane przez „#”:

% # 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')

Źródło: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Jak stwierdził Sagneta: sztuczka # hash w systemie Windows jest dostępna tylko dla natywnego pliku wykonywalnego Pythona. to nie zadziała w przypadku implementacji Pythona opartych na cygwin.


źródło
3
To jest poprawne. Należy jednak pamiętać, że sztuczka # hash w systemie Windows jest dostępna tylko dla natywnych plików wykonywalnych Pythona. Innymi słowy, to nie zadziała w przypadku implementacji Pythona opartych na Cygwin.
sagneta
2
Wow, świetnie wiedzieć, ale jestem przerażony konsekwencjami. Testuję formatowanie daty zwrócone z bazy danych i muszę przejść w oczekiwanym formatowaniu dla każdego testu, a to dodaje mnóstwo złożoności.
Keith
10

Dobra odpowiedź od Chrisa Freemana w systemie Linux.

W systemie Windows jest to:

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

Pomyślałem, że to może pomóc.

user3685285
źródło
0

„% l” (mała litera L) oznacza godzinę (zamiast „% I”). Wiem to tylko z innej odpowiedzi tutaj

Python strftime - data bez początkowego 0?

ale niestety nie mają kodu dla innych elementów daty / czasu.

Rob Cranfill
źródło