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

90

Есть ли формат для печати даты и времени Python, который не будет использовать нулевое заполнение даты и времени?

Формат, который я сейчас использую:

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

Результат: 29.02.2012 17:03
Желаемый: 29.02.2012 17:03

В каком формате месяц будет отображаться как «2» вместо «02», а время - как «17:03 PM» вместо «05:03 PM»

Ярин
источник

Ответы:

77

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

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
Свен Марнах
источник
1
Свен: Потому что я хочу выглядеть как Facebook. Благодарность!
Ярин
4
В Северной Америке очень немногие люди используют часы с нулями, когда пишут время от руки.
Эрик Уокер
2
Не будет ли это по-прежнему нулевой отметкой в ​​день месяца?
Судья Мэйгарден,
1
@JudgeMaygarden: Вот почему решение помогает .lstrip("0")избавиться от ведущего нуля.
Sven Marnach
1
Почему я хочу удалить обнуления контактных площадок? Потому что это неправильно по RFC 2822 , например, в ленте подкастов.
Виталий Зданевич
165

Другая альтернатива, позволяющая избежать аспекта «все или ничего» в начале нулевого значения выше, - это поставить минус перед типом поля:

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

Тогда это: '10.04.2015 03:00 AM'

Становится: '10.04.2015 3:00 AM'

При желании вы можете поставить минус перед днем.

Изменить: минус-функция происходит от библиотеки GNU C («glibc»), как указано на странице руководства Linux strftime в разделе «Примечания к Glibc».

Крис Фриман
источник
48
Отличный ответ, но только для Linux. Не будет работать в Windows. stackoverflow.com/questions/10807164/…
ExactaBox 07
1
Почему это работает? Я не могу найти ссылку на это в документах для date.__format__or 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 06
1
фак! Я просто понял, где я не указывал d на другой объект, я просто передал его как позиционный аргумент.
JacobIRR
50

Принятый ответ не является правильным решением (ИМХО) Надлежащие документированные методы:

В 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
Здорово знать, но я в ужасе от последствий. Я тестирую форматирование даты, возвращаемое из базы данных, и мне нужно передать ожидаемое форматирование для каждого теста, и это добавляет массу сложности.
Keith
10

Хороший ответ от Криса Фримена о Linux.

В окнах это:

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

Думал, что это может помочь.

user3685285
источник
0

«% l» (это строчная L) работает в течение часа (вместо «% I»). Я знаю это только из другого ответа здесь

Python strftime - дата без начального 0?

но, к сожалению, у них нет кода для других элементов даты / времени.

Роб Крэнфилл
источник