Odpowiedzi:
Właściwie miałem ten sam problem i zdałem sobie sprawę, że jeśli dodasz łącznik między %
literą a literą, możesz usunąć wiodące zero.
Na przykład %Y/%-m/%-d
.
Działa to tylko w systemach Unix (Linux, OS X), a nie Windows (w tym Cygwin). W systemie Windows użyłbyś #
np %Y/%#m/%#d
.
ValueError: '-' is a bad directive in format '%b %-d, %Y'
. OSX, Python 2.7.
%#d
zrobiłby to samo na Windowsie
Możemy to zrobić dzięki pojawieniu się tej format
metody od python2.6:
>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'
Chociaż być może poza zakresem oryginalnego pytania, w celu uzyskania bardziej interesujących formatów możesz robić rzeczy takie jak:
>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'
Od wersji Python3.6 można to wyrazić jako ciąg sformatowany w wierszu :
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'
time.strftime('%A %B %d, %Y')
, która daje (teraz w języku angielskim) Tuesday October 07, 2014
.
__format__
haczyk, który pozwala pisać takie rzeczy.
'{dt.hour}'
używa zegara 24-godzinnego :(. Użycie drugiej opcji wciąż powoduje powrót do korzystania '{%#I}'
z systemu Windows i '{%-I}'
Uniksa.
Niektóre platformy mogą obsługiwać specyfikację szerokości i precyzji między %
literą a literą (np. „D” na dzień miesiąca), zgodnie z http://docs.python.org/library/time.html - ale zdecydowanie nie jest przenośny rozwiązanie (np. nie działa na moim komputerze Mac ;-). Może możesz użyć zamiany ciągu (lub RE, dla naprawdę paskudnego formatu) po tym, strftime
aby temu zaradzić? na przykład:
>>> 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'
Oto dokumentacja modyfikatorów obsługiwanych przez strftime()
bibliotekę GNU C. (Jak ludzie mówili wcześniej, może nie być przenośny). Interesujące może być:
%e
zamiast %d
zastąpi wiodące zero w dniu miesiąca spacjąDziała na moim Pythonie (w systemie Linux). Nie wiem, czy to zadziała na twoim.
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'
.replace('X0','X').replace('X','')
? Po prostu zrób .replace('X0', '')
i będzie dobrze.
W systemie Windows dodaj „#”, jak w „% # m /% # d /% Y% # I:% M:% S% p”
W celach informacyjnych: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
dość późno na imprezę, ale %-d
działa na moim końcu.
datetime.now().strftime('%B %-d, %Y')
produkuje coś w stylu „5 listopada 2014 r.”
Twoje zdrowie :)
ValueError: Invalid format string
w moim systemie Windows.
Uważam, że filtr formatowania daty szablonu Django jest szybki i łatwy. Usuwa początkowe zera. Jeśli nie masz nic przeciwko importowaniu modułu Django, sprawdź to.
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')
import django.conf
django.conf.settings.configure()
Spójrz na -
poniższe:
>>> 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)
po prostu użyj replace
tego:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
wyświetli:
'2017/7/21'
Aby %d
przekonwertować na liczbę całkowitą za pomocą, int()
wówczas automatycznie usunie początkowe 0 i stanie się liczbą całkowitą. Następnie możesz przekonwertować z powrotem na ciąg za pomocą str()
.
użycie na przykład „% -d” nie jest przenośne nawet między różnymi wersjami tego samego systemu operacyjnego. Lepszym rozwiązaniem byłoby wyodrębnienie komponentów daty indywidualnie i wybranie pomiędzy operatorami formatowania specyficznymi dla daty a dostępem do atrybutu daty dla każdego komponentu.
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Ponieważ Python tak naprawdę wywołuje funkcję języka C strftime(3)
na twojej platformie, być może istnieją znaki formatu, których możesz użyć do kontrolowania wiodącego zera; próbowaćman strftime
spojrzeć. Ale oczywiście wynik nie będzie przenośny, jak przypomni Ci instrukcja Python. :-)
Chciałbym spróbować użyć nowego stylu datetime
obiekt zamiast, który posiada atrybuty, jak t.year
i t.month
i t.day
i włożył ci poprzez normalne, high-powered formatowania z %
operatorem, który obejmuje kontrolą pomocy wiodących zer. Szczegółowe informacje można znaleźć na stronie http://docs.python.org/library/datetime.html . Jeszcze lepiej, użyj "".format()
operatora, jeśli Twój Python go ma i jest jeszcze bardziej nowoczesny; ma również wiele opcji formatowania liczb. Zobacz: http://docs.python.org/library/string.html#string-formatting .
W oparciu o metodę Alexa będzie to działać zarówno w przypadku ciągów początkowych, jak i późniejszych:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
Podoba mi się to lepiej niż .format lub% -d, ponieważ jest to platforma wieloplatformowa i pozwala mi nadal używać strftime (aby uzyskać takie rzeczy jak „listopad” i „poniedziałek”).
Stare pytanie, ale% l (małe litery L) działało dla mnie w strftime: może to nie działać dla wszystkich, ponieważ nie jest wymienione w dokumentacji Pythona, którą znalazłem
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'
using python 3.5