Python strftime - önde 0 olmadan tarih?


277

Python kullanırken, 10'dan strftimeönce ise tarihin ilk 0'ını kaldırmanın bir yolu var mı, yani. böylece 01olduğunu 1? Bunun için bir %şey bulamıyor musunuz?

Teşekkürler!

Yanıtlar:


568

Aslında aynı sorunu yaşadım ve fark ettim ki, %ile harf arasına bir tire eklerseniz baştaki sıfırı kaldırabilirsiniz.

Örneğin %Y/%-m/%-d .

Bu yalnızca Unix (Linux, OS X) üzerinde çalışır, Windows (Cygwin dahil) üzerinde çalışmaz. Windows'ta #, örneğin;%Y/%#m/%#d ;


11
Benim için bile çalışmıyor, bir ValueError verir (windows, python 2.6)
rocketmonkey

14
OS X'de benim için çalıştı, ancak python.org'dan Python 2.7.2'yi kullanıyorum.
Tim Swast

13
@moose Bu konuda bir soru sordum :-) İşte cevap -> stackoverflow.com/questions/28894172/…
Mathias

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

8
%#daynısını Windows'ta yapar
dalle

190

Bu tür bir şeyi, formatpython2.6'dan bu yana yöntemin ortaya çıkışı ile yapabiliriz :

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

Belki de orijinal sorunun kapsamı dışında olsa da, daha ilginç formatlar için aşağıdakileri yapabilirsiniz:

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

Ve python3.6'dan itibaren, bu satır içi biçimlendirilmiş dize olarak ifade edilebilir :

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
Çok hoş! Maalesef time.strftime('%A %B %d, %Y')(şimdi, İngilizce yerel ayarlarında) gibi metinsel temsili kullanmak istiyorsanız tek başına çalışmaz Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck - Yorumunuzu şimdiye kadar fark etmemiş olmamın bir nedeni. Tarih saatinin __format__böyle şeyler yazmanıza izin veren çok ilginç bir kanca belirttiği ortaya çıkıyor .
mgilson

2
Bir sorun, '{dt.hour}'24 saatlik bir saat kullanmasıdır :(. İkinci seçeneği kullanmak sizi hala '{%#I}'Windows ve '{%-I}'Unix'te kullanmaya geri getirir .
ubomb

İyi bir nokta. Asla kodda 12 saatlik gösterim kullanmıyorum, bu yüzden bu durumu düşünmedim.
mgilson

Biçim işlevselliği ile ilgili bu ek belgelere bakmanızı öneririm
Mark

37

Bazı platformlar, http://docs.python.org/library/time.html% adresine göre ve ay arasındaki genişlik ve kesinlik özelliklerini destekleyebilir (ayın günü için 'd' gibi) - ancak kesinlikle taşınabilir değil çözümü (örn. Mac ;-) üzerinde çalışmıyor. Belki bunu gidermek için bir dize değiştirme (veya RE, gerçekten kötü bir format için) kullanabilirsiniz? Örneğin:strftime

>>> 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 ne demek istiyorsun? '1 Ocak 2000' ile sonuçlanmalıdır
Kullanıcı

6
@Kullanıcı Yukarıdaki kod, 0'dan önce "01 Ocak 2000" olması durumunda boş bir alanı kontrol eder.
Alagappan Ramu

@alex Lütfen bu cevabı silin, muhtemelen bildiğiniz gibi doğru cevaptan uzak.
CONvid19

29

İştestrftime() GNU C kütüphanesinde desteklenen değiştiricilerin belgeleri . (Daha önce söylediği gibi, taşınabilir olmayabilir.) İlginizi çekebilir:

  • %eyerine %dayın başındaki sıfırı bir boşlukla değiştirecek

Python'umda (Linux'ta) çalışır. Senin üzerinde çalışıp çalışmayacağını bilmiyorum.


3
% e Windows için Python 2.6 ile benim için başarısız oluyor. Sanırım bu * nix'e özgü. Çok kötü :(
roketmonkeys

1
En azından bir * nix sisteminde en temiz, en genel çözüm budur. Bu OS X üzerinde çalışır.
BFTM

Gibi %-d yukarıdaki , Python 2.7.2 ile OS X 10.8.5 bu eserler, ancak Windows Python 2.7.3 ile 7 Pro 64 bit.
Johan

1
Bu benim için Python 3.5.1 ile Windows 7 SP1'de çalıştı.
Neil Billingham

1
Bu, baştaki sıfır yerine fazladan bir boşluk getirdi, bu yüzden tam bir eşleşme arıyorsanız, bu olmayabilir. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 23' >>> onbir = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> eleven.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
Bu 01 Ocak 2000'de çalışıyor, Alexs çalışmıyor.
guneysus

Amaç ne .replace('X0','X').replace('X','')? Sadece yap .replace('X0', '')ve iyi olacak.
Marco Bonelli

2
@MarcoBonelli: "X12 / X12 / 14" dizesindeki önerinizi deneyin, göreceksiniz.
gdw2

1
Bu bir hack, ama bir pitonik hack.
Josh M.



10

Django şablon tarih formatlama filtresini hızlı ve kolay buluyorum. Baştaki sıfırları çıkarır. Django modülünü içe aktarmanın bir sakıncası yoksa modülü kontrol edin.

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

Eğer benim gibi iseniz ve uygulamanızı import django.conf django.conf.settings.configure()
django'da oluşturmuyorsanız, django'ya

8

Körüğe bir göz atın -:

>>> 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)

Python 3'te mükemmel çalışıyor
Saurabh

Bu kabul edilen cevap olmalı. Ne sorulur yapar, süper basit ve hatırlaması kolay. Dokümanlar arasında hızlıca gezinirken bu bilgileri bulamadım.
Lucas Lima

1
"Bu kabul edilen cevap olmalı". Hayır, olmamalı, çünkü bu sadece Linux'ta çalışıyor.
user136036


3

İçin %dkullanmakta tamsayıya dönüştürmek int()o zaman otomatik olarak 0 lider çıkarıp tamsayı olur edeceğiz. Sonra kullanarak dizeye geri dönüştürebilirsiniz str().


2
OP soru str () içeren kendi kendine bir rulo yerine strftime çağrısında bir format belirteç kullanan bir çözüm içindi
Dave Hooper

harika cevap, dave hooper dinlemeyin
Toskan

3

örneğin, "% -d" kullanmak aynı işletim sisteminin farklı sürümleri arasında bile taşınabilir değildir. Tarih bileşenlerini tek tek ayıklamak ve her bileşenin tarihe özgü biçimlendirme işleçleri ile tarih özniteliği erişimi arasında seçim yapmak daha iyi bir çözüm olabilir.

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

2

Python gerçekten strftime(3)platformunuzdaki C dili işlevini çağırdığı için , baştaki sıfırı kontrol etmek için kullanabileceğiniz biçim karakterleri olabilir; denemek man strftimeve bir göz atın. Ancak, elbette, Python kılavuzu size hatırlatacağı için sonuç taşınabilir olmayacaktır. :-)

Yeni bir tarzı kullanmayı deneyin olacağını datetimebenzer özelliklere sahip olan, bunun yerine nesne t.yearve t.monthve t.dayve yoluyla bu koymak, normal, yüksek güçlü biçimlendirmesi de %lider sıfırların destek kontrolünü yapar operatörü. Ayrıntılar için http://docs.python.org/library/datetime.html adresine bakın. Daha da iyisi, "".format()Python'unuz varsa operatörü kullanın ve daha modern olun; sayılar için de birçok biçim seçeneği vardır. Bkz . Http://docs.python.org/library/string.html#string-formatting .


2

Alex'in yöntemine dayanarak, bu hem dize başlangıcı hem de boşluk sonrası durumlar için işe yarayacaktır:

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

Bunu .format veya% -d'den daha çok seviyorum çünkü bu çapraz platform ve strftime ("Kasım" ve "Pazartesi" gibi şeyler almak için) kullanmaya devam etmeme izin veriyor.


1

Eski soru, ama% l (küçük harf L) benim için zor işlerde çalıştı: Bu, bulduğum Python belgelerinde listelenmediği için herkes için işe yaramayabilir.


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

Bu, baştaki sıfırı bir boşlukla değiştirir, bu da OP'nin istediği şey değildir
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'Python 3.5 kullanarak
ji-ruh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.