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!

Solihull
sumber

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.

Ryan
sumber
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'
mgilson
sumber
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'
Alex Martelli
sumber
@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.

berita baru
sumber
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'
gdw2
sumber
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.
18

cukup terlambat ke pesta tetapi %-dbekerja pada saya.

datetime.now().strftime('%B %-d, %Y')menghasilkan sesuatu seperti "5 November 2014"

Bersulang :)

bonbon.langes
sumber
1
duplikat jawaban utama? stackoverflow.com/a/2073189/389812
gdw2
2
ValueError: Invalid format stringdi sistem Windows saya.
Deqing
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')    
mcqwerty
sumber
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)
ptronico
sumber
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
4

cukup gunakan replaceseperti ini:

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

itu akan menampilkan:

'2017/7/21'
Mohammad Hossein Shojaeinia
sumber
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().

Nathan Viboonchan
sumber
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)
Chris Chewa
sumber
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 .

Brandon Rhodes
sumber
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").

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

OliverRadini
sumber
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
pengguna7503128
sumber
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