Форматування дати та часу Python без заповнення нулем


90

Чи існує формат для друку дати Python, який не використовуватиме нульових відступів для дат та часу?

Формат, який я використовую зараз:

mydatetime.strftime('%m/%d/%Y %I:%M%p')

Результат: 02/29/2012 5:03 вечора
Бажана: 2/29/2012 5:03 вечора

Який формат представляв би місяць як "2" замість "02", а час як "17:03" замість "05: 03 PM"

Відповіді:


77

Параметри форматування, доступні з, datetime.strftime()будуть нульовими. Звичайно, ви можете прокрутити власну функцію форматування, але найпростішим рішенням у цьому випадку може бути подальша обробка результату datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")

1
Свен - Тому що я хочу виглядати як Facebook. Дякую!
Ярін,

4
Дуже мало хто використовує години з нульовою підкладкою в Північній Америці, коли записує час від руки.
Eric Walker

2
Чи не буде це все одно нульовою подушкою день місяця?
суддя Мейгарден

1
@JudgeMaygarden: Ось чому рішення робить, .lstrip("0")щоб позбутися провідного нуля.
Sven Marnach

1
Чому я хочу видалити нульові позначки? Оскільки RFC 2822 це неправильно , наприклад у стрічці подкастів.
Віталій Зданевич

165

Інший варіант, щоб уникнути нульового аспекту "все або нічого", що наведений вище, - це розміщення мінуса перед типом поля:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

Тоді це: '10.10.2015 03:00'

Становиться: '10.04.2015 03:00'

За бажанням ви можете поставити мінус перед днем.

Редагувати: мінусова функція походить від бібліотеки GNU C (“glibc”), як зазначено на сторінці strftime Linux у розділі “Примітки Glibc”


48
Чудова відповідь, але лише Linux. Не буде працювати в Windows. stackoverflow.com/questions/10807164 / ...
ExactaBox

1
Чому це працює? Я не можу знайти посилання на це в документах date.__format__або time.strftime, docs.python.org/3/library/… та docs.python.org/3.8/library/time.html#time.strftime відповідно
Амін Шах Гілані

1
Допис @AminShahGilani оновлено посиланням на src
ChrisFreeman

93

Нова система форматування рядків пропонує альтернативу strftime. Це цілком читабельно - справді, це може бути кращим, ніж strftimeз цього приводу. Не кажучи вже про той факт, що він не нульовий:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

Оскільки вам, напевно, потрібне нульове заповнення в хвилинному полі, ви можете зробити це:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

Якщо ви хочете "регулярний" час замість "військовий" час, ви все ще можете використовувати стандартні strftimeспецифікатори, а також. Зручно, для наших цілей, strftime робить надати код для часу прокладених 12 годин з порожнім замість провідного нуля:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

На жаль, це стає дещо менш читабельним. І як зазначає @mlissner, strftimeне вдасться на деяких (усіх?) Платформах дати до 1900 року.


1
Він існує з python 2.6. (Це не що нове.)
senderle

3
Наприклад, щоб вказати місяць, ви можете використовувати наступне: "{0.day} {0:%B %Y}".format(d)що дасть вам '2 August 2013'день цього коментаря :)
Йенс,

2
Це цікаво, але насправді не відповідає на OP, оскільки він хоче годин AM / PM. Я насправді не збираюся його проти, але прийнята відповідь насправді є правильною, якщо ви намагаєтесь отримати "американське" форматування дати / часу в python.
Дана Картрайт

Зверніть увагу, що в цій техніці використовується strftime, яке не вдасться здійснити на дати до 1900 року. Якщо у вас старі дати, ви пошкодуєте про це.
mlissner

1
фак! Я просто зрозумів, де я не вказав d на інший об’єкт, я просто передав його як позиційний аргумент.
JacobIRR

50

Прийнята відповідь не є належним рішенням (IMHO) Належні задокументовані методи:

У Linux "#" замінено на "-":

% -d,% -H,% -I,% -j,% -m,% -M,% -S,% -U,% -w,% -W,% -y,% -Y

У Windows "-" замінено на "#":

% # d,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% # Y

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

Джерело: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Як зазначив Sagneta: # хеш-трюк у Windows доступний лише для власного виконуваного файлу python. це не буде працювати для реалізацій python на основі cygwin.


3
Це вірно. Однак слід зазначити, що # хеш-трюк у Windows доступний лише для власних виконуваних файлів python. Іншими словами, це не буде працювати для реалізацій python на основі cygwin.
sagneta

2
Вау це чудово знати, але я жахлюся наслідків. Я тестую форматування дати, повернутої з бази даних, і мені потрібно передати очікуване форматування для кожного тесту, і це додає тонни складності.
Кіт

10

Гарна відповідь від Кріса Фрімена на Linux.

На вікнах це:

mydate.strftime('%#m/%#d/%Y')

Думав, що може допомогти.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.