Pemformatan waktu Python tanpa padding nol


90

Apakah ada format untuk mencetak datetimes Python yang tidak akan menggunakan zero-padding pada tanggal dan waktu?

Format yang saya gunakan sekarang:

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

Hasil: 29/02/2012 05:03 PM
Diinginkan: 29/2/2012 5:03

Format apa yang merepresentasikan bulan sebagai '2' bukan '02', dan waktu sebagai '5:03 PM' bukan '05: 03PM '

Jawaban:


77

Opsi pemformatan tersedia dengan datetime.strftime()semua tombol nol. Anda tentu saja dapat menggulung Anda sendiri fungsi pemformatan, tetapi solusi termudah dalam kasus ini mungkin untuk pasca-proses hasil dari datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")

1
Sven- Karena saya ingin terlihat seperti Facebook. Terima kasih!
Yarin

4
Sangat sedikit orang yang menggunakan jam tanpa bantalan di Amerika Utara saat menulis waktu dengan tangan.
Eric Walker

2
Bukankah ini masih nol pada hari dalam sebulan?
Hakim Maygarden

1
@JudgeMaygarden: Itulah mengapa solusi dilakukan .lstrip("0")untuk menghilangkan nol di depan.
Sven Marnach

1
Mengapa saya ingin menghapus angka nol? Karena ini salah dengan RFC 2822 , misalnya di feed podcast.
Vitaly Zdanevich

165

Alternatif lain untuk menghindari aspek nol di depan "semua atau tidak ada" di atas adalah dengan menempatkan tanda minus di depan jenis bidang:

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

Kemudian ini: '4/10/2015 03:00'

Menjadi: '4/10/2015 3:00 AM'

Anda dapat secara opsional menempatkan minus di depan hari jika diinginkan.

Sunting: Fitur minus berasal dari perpustakaan GNU C ("glibc") seperti yang disebutkan di halaman manual strftime Linux di bawah "Catatan Glibc"


48
Jawaban bagus, tapi hanya untuk Linux. Tidak akan berfungsi di Windows. stackoverflow.com/questions/10807164/…
ExactaBox

1
Mengapa ini berhasil? Saya tidak dapat menemukan referensi ini di dokumen untuk date.__format__or time.strftime, docs.python.org/3/library/… , dan docs.python.org/3.8/library/time.html#time.strftime masing
Amin Shah Gilani

1
Posting @AminShahGilani diperbarui dengan referensi src
ChrisFreeman

93

Sistem pemformatan string baru menyediakan alternatif untuk strftime. Ini cukup mudah dibaca - memang, mungkin lebih disukai strftimepada akun itu. Belum lagi fakta bahwa itu tidak nol-pad:

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

Karena Anda mungkin menginginkan bantalan nol di bidang menit, Anda dapat melakukan ini:

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

Jika Anda menginginkan waktu "reguler" daripada waktu "militer", Anda masih dapat menggunakan strftimepenentu standar juga. Mudah, untuk tujuan kita, strftime tidak memberikan kode untuk waktu empuk 12 jam dengan kosong bukannya nol:

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

Sayangnya, ini menjadi agak kurang terbaca. Dan seperti yang ditunjukkan @mlissner, strftimeakan gagal di beberapa (semua?) Platform untuk tanggal sebelum tahun 1900.


1
Sudah ada sejak python 2.6. (Ini bukan yang baru.)
senderle

3
Untuk mengeja bulan, misalnya, Anda dapat menggunakan yang berikut ini: "{0.day} {0:%B %Y}".format(d)yang akan memberi Anda '2 August 2013'hari komentar ini :)
Jens

2
Ini menarik, tapi sebenarnya tidak menjawab OP, karena dia mau jam AM / PM. Saya sebenarnya tidak akan merendahkannya, tetapi jawaban yang diterima sebenarnya benar jika Anda mencoba mendapatkan format tanggal / waktu "Amerika" dengan python.
Dana Cartwright

Perhatikan bahwa teknik ini menggunakan strftime, yang akan gagal pada tanggal sebelum tahun 1900. Jika Anda memiliki tanggal lama, Anda akan menyesalinya.
mlissner

1
fak! Saya baru menyadari di mana saya tidak mengarahkan d ke objek lain, saya hanya meneruskannya sebagai argumen posisi.
JacobIRR

50

Jawaban yang diterima bukan solusi yang tepat (IMHO) Metode terdokumentasi yang tepat:

Di Linux "#" diganti dengan "-":

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

Di Windows "-" diganti dengan "#":

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

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

Seperti yang dinyatakan oleh Sagneta: Trik hash # di Windows hanya tersedia untuk executable python asli. ini tidak akan berfungsi untuk implementasi python berbasis cygwin.


3
Ini benar. Namun perlu dicatat bahwa # trik hash pada Windows hanya tersedia untuk executable python asli. Dengan kata lain, ini tidak akan berfungsi untuk implementasi python berbasis cygwin.
sagneta

2
Wow, senang mengetahuinya tapi saya ngeri dengan konsekuensinya. Saya menguji format tanggal yang dikembalikan dari Database dan saya harus meneruskan format yang diharapkan untuk setiap pengujian dan ini menambahkan banyak kerumitan.
Keith

10

Jawaban bagus dari Chris Freeman di Linux.

Di windows, ini:

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

Pikir itu mungkin membantu.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.