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 '

Yarin
sumber

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", " ")
Sven Marnach
sumber
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"

ChrisFreeman
sumber
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.

pengirim
sumber
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.


sumber
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.

pengguna3685285
sumber
0

"% l" (itu L huruf kecil) bekerja untuk satu jam (bukan "% I"). Saya hanya mengetahui ini dari jawaban lain di sini

Python strftime - tanggal tanpa awalan 0?

tapi sayangnya mereka tidak memiliki kode untuk elemen lain dari tanggal / waktu.

Rob Cranfill
sumber