Відповіді:
Насправді у мене була така ж проблема, і я зрозумів, що, якщо додати дефіс між %
буквою та буквою, ти можеш зняти провідний нуль.
Наприклад %Y/%-m/%-d
.
Це працює лише на Unix (Linux, OS X), а не на Windows (включаючи Cygwin). У Windows ви б використовували #
, напр %Y/%#m/%#d
.
ValueError: '-' is a bad directive in format '%b %-d, %Y'
. OSX, Python 2.7.
%#d
зробив би те ж саме в Windows
Ми можемо зробити подібне з появою format
методу з python2.6:
>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'
Хоча це можливо виходить за рамки оригінального запитання, для більш цікавих форматів ви можете робити такі речі, як:
>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'
А що стосується python3.6, це може бути виражено рядком у форматованому рядком :
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')
, яке дає результати (зараз, на англійській мові) Tuesday October 07, 2014
.
__format__
гачок, що дозволяє писати подібні речі.
'{dt.hour}'
використовується цілодобовий годинник :(. Використання другого варіанту все одно повертає вас до використання '{%#I}'
в Windows та '{%-I}'
Unix.
Деякі платформи можуть підтримувати специфікацію ширини та точності між %
буквою та буквою (наприклад, 'd' на місяць місяця), згідно з http://docs.python.org/library/time.html - але це, безумовно, не портативний рішення (наприклад, не працює на моєму Mac ;-). Можливо, ви можете використати заміну рядка (або RE, для дійсно неприємного формату) після того, 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'
Ось документація модифікаторів, що підтримуються strftime()
в бібліотеці GNU C. (Як люди говорили раніше, це може бути не портативно.) Цікавим для вас може бути:
%e
замість того, %d
щоб замінити провідний нуль у дні місяця пробіломВін працює на моєму Python (в Linux). Я не знаю, чи буде це працювати над вашими.
>>> 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','')
? Просто роби, .replace('X0', '')
і це буде добре.
У Windows додайте "#", як у "% # m /% # d /% Y% # I:% M:% S% p"
Довідково: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx
досить пізно на вечірку, але %-d
працює на мій кінець.
datetime.now().strftime('%B %-d, %Y')
виробляє щось подібне "5 листопада 2014 року"
ура :)
ValueError: Invalid format string
в моїй системі Windows.
Я вважаю, що фільтр форматування дати Django є швидким та простим. Це викреслює провідні нулі. Якщо ви не проти імпортувати модуль Django, перевірте це.
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()
Подивіться -
нижче:
>>> 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)
просто використовуйте replace
так:
(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")
він виведе:
'2017/7/21'
Оскільки %d
ви можете конвертувати в ціле число, використовуючи int()
тоді, він автоматично видалить провідні 0 і стане цілим числом. Потім можна конвертувати назад у рядок за допомогою str()
.
наприклад, "% -d" не переноситься навіть між різними версіями однієї ОС. Кращим рішенням буде вилучення компонентів дати окремо та вибір між операторами форматування конкретних дат та доступом до атрибутів дати для кожного компонента.
e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)
Оскільки Python насправді просто викликає функцію мови C strftime(3)
на вашій платформі, можливо, є символи формату, які можна використовувати для керування початковим нулем; спробуйте man strftime
і погляньте. Але, звичайно, результат не буде портативним, оскільки нагадає керівництво Python. :-)
Я б спробував використати об’єкт нового стилю datetime
, який має такі атрибути, як t.year
і t.month
і t.day
, і перенести їх через звичайне, потужне форматування %
оператора, яке підтримує управління провідними нулями. Детальні відомості див. У розділі http://docs.python.org/library/datetime.html . А ще краще, скористайтеся "".format()
оператором, якщо ваш Python має його та буде ще сучаснішим; У ньому також багато варіантів формату для чисел. Дивіться: http://docs.python.org/library/string.html#string-formatting .
На основі методу Алекса це буде працювати як для запуску рядків, так і після пробілів:
re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")
Мені це подобається більше, ніж .format або% -d, тому що це крос-платформа і дозволяє мені продовжувати використовувати стропіл (щоб отримати такі речі, як "Листопад" і "Понеділок").
Старе запитання, але% l (нижній регістр L) працював на мене у стропіллі: це може не працювати для всіх, хоча це не зазначено в документації Python, яку я знайшов
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'
використовуючи python 3.5