Python strftime - tanggal tanpa memimpin 0?


277

Saat menggunakan Python strftime, apakah ada cara untuk menghapus 0 pertama dari tanggal jika sebelum tanggal 10, yaitu. begitu 01juga 1? Tidak dapat menemukan sesuatu %untuk itu?

Terima kasih!

Jawaban:


568

Sebenarnya saya memiliki masalah yang sama dan saya menyadari bahwa, jika Anda menambahkan tanda hubung antara %dan huruf, Anda dapat menghapus nol di depannya.

Sebagai contoh %Y/%-m/%-d.

Ini hanya berfungsi pada Unix (Linux, OS X), bukan Windows (termasuk Cygwin). Pada Windows, Anda akan menggunakan #, misalnya %Y/%#m/%#d.


11
Bahkan tidak bekerja untuk saya, memberikan ValueError (windows, python 2.6)
rocketmonkeys

14
Ini bekerja untuk saya di OS X, tapi saya menggunakan Python 2.7.2 dari python.org.
Tim Swast

13
@moose Saya mengajukan pertanyaan tentang ini :-) inilah jawabannya -> stackoverflow.com/questions/28894172/…
Mathias

10
Saya mengerti ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard

8
%#dakan melakukan hal yang sama pada Windows
dalle

190

Kita dapat melakukan hal semacam ini dengan munculnya formatmetode sejak python2.6:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

Meskipun mungkin di luar cakupan pertanyaan asli, untuk format yang lebih menarik, Anda dapat melakukan hal-hal seperti:

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

Dan pada python3.6, ini dapat diekspresikan sebagai string yang diformat sebaris :

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'

2
Sangat bagus! Sayangnya tidak berfungsi sendiri jika Anda ingin menggunakan representasi tekstual suka time.strftime('%A %B %d, %Y'), yang menghasilkan (sekarang, di lokal bahasa Inggris) Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck - Beberapa alasan saya belum memperhatikan komentar Anda sampai sekarang. Ternyata datetime menentukan __format__pengait yang sangat menarik yang memungkinkan Anda menulis hal-hal seperti itu.
mgilson

2
Satu masalah adalah bahwa '{dt.hour}'menggunakan jam 24 jam :(. Menggunakan opsi kedua masih membawa Anda kembali ke penggunaan '{%#I}'di Windows dan '{%-I}'di Unix.
ubomb

Poin yang bagus. Saya tidak pernah menggunakan representasi jam 12 jam dalam kode, jadi saya tidak memikirkan hal itu.
mgilson

Saya sarankan melihat dokumentasi tambahan ini pada fungsionalitas format: pyformat.info
Mark

37

Beberapa platform mungkin mendukung spesifikasi lebar dan presisi antara %dan huruf (seperti 'd' untuk hari bulan), menurut http://docs.python.org/library/time.html - tapi itu jelas non-portable solusi (mis. tidak bekerja di Mac saya ;-). Mungkin Anda dapat menggunakan ganti string (atau RE, untuk format yang benar-benar jahat) setelah strftimeuntuk memperbaikinya? misalnya:

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'

@guneysus apa maksudmu? Seharusnya menghasilkan '1 Januari 2000'
Pengguna

6
@ Pengguna Kode di atas memeriksa ruang kosong sebelum 0 yang dalam hal "01 Januari 2000" tidak ada.
Alagappan Ramu

@alex Harap hapus jawaban ini, karena Anda mungkin tahu, itu jauh dari jawaban yang benar.
CONvid19

29

Berikut ini adalah dokumentasi dari pengubah yang didukung oleh strftime()di GNU C library. (Seperti yang dikatakan orang sebelumnya, mungkin tidak portabel.) Yang menarik bagi Anda mungkin:

  • %ealih-alih %dakan menggantikan nol di awal bulan dengan spasi

Ini bekerja di Python saya (di Linux). Saya tidak tahu apakah itu akan berhasil pada Anda.


3
% e gagal untuk saya di Windows dengan Python 2.6. Saya menduga ini * spesifik nix. Sayang sekali :(
rocketmonkeys

1
Ini adalah solusi paling bersih, paling umum, --- pada sistem * nix, setidaknya. Ini berfungsi pada OS X.
BFTM

Seperti di %-d atas , ini berfungsi di OS X 10.8.5 dengan Python 2.7.2, tetapi tidak di Windows 7 Pro 64-bit dengan Python 2.7.3.
Johan

1
Ini bekerja untuk saya di Windows 7 SP1 dengan Python 3.5.1.
Neil Billingham

1
Ini memperkenalkan ruang ekstra alih-alih nol di depan jadi jika Anda mencari kecocokan yang tepat, ini mungkin bukan. >>> satu = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 Mei 23' >>> sebelas = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> sebelas.strftime ('% b% e% H')
'11

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
Ini berfungsi 01 Januari 2000, Alexs tidak bekerja.
guneysus

Apa gunanya .replace('X0','X').replace('X','')? Lakukan saja .replace('X0', '')dan itu akan baik.
Marco Bonelli

2
@ Marscoonelli: Coba saran Anda pada string "X12 / X12 / 14" dan Anda akan melihat.
gdw2

1
Ini adalah retas, tetapi ini adalah retas pythonic.
Josh M.



10

Saya menemukan filter format tanggal template Django menjadi cepat dan mudah. Ini menghapus nol terkemuka. Jika Anda tidak keberatan mengimpor modul Django, periksa.

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    

Perhatikan bahwa jika Anda seperti saya dan Anda tidak membangun aplikasi di Django, Anda harus memberi tahu Django bahwa Anda tidak perlu mengkonfigurasinya:import django.conf django.conf.settings.configure()
Alex Pretzlav

8

Lihatlah di -bawah ini:

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)

Bekerja dengan sempurna di python 3
Saurabh

Ini harus menjadi jawaban yang diterima. Melakukan apa yang diminta, super sederhana dan mudah diingat. Menjelajah dengan cepat melalui dokumen saya tidak dapat menemukan informasi ini.
Lucas Lima

1
"Ini seharusnya jawaban yang diterima". Tidak seharusnya tidak, karena ini hanya berfungsi di Linux.
user136036


3

Untuk %dAnda dapat mengonversi ke integer menggunakan int()maka secara otomatis akan menghapus 0 memimpin dan menjadi integer. Anda kemudian dapat mengonversi kembali ke string menggunakan str().


2
Pertanyaan OP adalah solusi menggunakan penentu format dalam panggilan ke strftime, bukan solusi roll-your-sendiri yang melibatkan str ()
Dave Hooper

jawaban yang bagus, jangan dengarkan dave hooper
Toskan

3

menggunakan, misalnya, "% -d" tidak portabel bahkan di antara berbagai versi OS yang sama. Solusi yang lebih baik adalah mengekstraksi komponen tanggal secara terpisah, dan memilih antara operator pemformatan khusus tanggal dan akses atribut tanggal untuk setiap komponen.

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

Karena Python benar-benar hanya memanggil strftime(3)fungsi bahasa C pada platform Anda, mungkin ada karakter format yang dapat Anda gunakan untuk mengontrol nol di depan; coba man strftimedan lihat. Tapi, tentu saja, hasilnya tidak akan portabel, karena manual Python akan mengingatkan Anda. :-)

Saya akan mencoba menggunakan datetimeobjek gaya baru sebagai gantinya, yang memiliki atribut seperti t.yeardan t.monthdan t.day, dan menempatkan mereka melalui format normal, bertenaga tinggi dari %operator, yang tidak mendukung kontrol nol terkemuka. Lihat http://docs.python.org/library/datetime.html untuk detailnya. Lebih baik lagi, gunakan "".format()operator jika Python Anda memilikinya dan menjadi lebih modern; ini memiliki banyak opsi format untuk angka juga. Lihat: http://docs.python.org/library/string.html#string-formatting .


2

Berdasarkan metode Alex, ini akan bekerja untuk kasus awal-string-dan setelah-spasi:

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

Saya suka ini lebih baik daripada .format atau% -d karena ini adalah cross-platform dan memungkinkan saya untuk tetap menggunakan strftime (untuk mendapatkan hal-hal seperti "November" dan "Senin").


1

Pertanyaan lama, tetapi% l (huruf kecil L) bekerja untuk saya di strftime: ini mungkin tidak berfungsi untuk semua orang, karena tidak terdaftar dalam dokumentasi Python yang saya temukan


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

Ini menggantikan nol di depan dengan spasi, yang bukan itu yang diminta OP
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'menggunakan python 3.5
ji-ruh
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.