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

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

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

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

Результат: 29 февраля 2012 г., 17:03
Желаемый: 29 февраля 2012 г., 17:03

Какой формат будет представлять месяц как «2» вместо «02», а время как «17:03» вместо «17:03»


person Yarin    schedule 01.03.2012    source источник


Ответы (6)


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

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")
person Sven Marnach    schedule 01.03.2012
comment
Свен: Потому что я хочу выглядеть как Facebook. Спасибо! - person Yarin; 02.03.2012
comment
Это полезно. Мне нужно было создать URL-адреса с незаполненными днями, и мне пришлось связать 3 из них вместе: dt.strftime(%B_)+dt.strftime(%d).lstrip(0)+dt.strftim\ e(,_% Y) - person philshem; 28.03.2014
comment
Очень немногие люди в Северной Америке используют часы с нулевым дополнением, когда пишут время от руки. - person Eric Walker; 24.04.2014
comment
Не будет ли это по-прежнему нулевым дополнением дня месяца? - person Judge Maygarden; 24.09.2014
comment
@JudgeMaygarden: Вот почему решение делает .lstrip("0"), чтобы избавиться от ведущего нуля. - person Sven Marnach; 26.09.2014
comment
Это единственный ответ, который работает так, как рекламируется в Windows, чтобы получить натурализованный вывод времени, но я бы хотел, чтобы был лучший способ. - person Adam Starrh; 17.06.2016
comment
Некоторые инструменты, напр. Журналы AWS CloudWatch плохо работают с отметками времени, не дополненными нулями. - person thinkski; 06.12.2016
comment
Просто добавив примечание, что %e вместо %d для дня месяца будет дополнять однозначные дни. Обычно это бесполезно, поэтому имеет смысл использовать подход .replace( 0, ) с %d. - person Kevin Buchs; 04.09.2017
comment
Почему я хочу удалить нули? Поскольку это неверно согласно RFC 2822, например, в ленте подкастов. - person Vitaly Zdanevich; 01.07.2019

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

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

Тогда это: "10.04.2015 03:00"

Преобразуется: '10.04.2015 3:00'

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

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

person ChrisFreeman    schedule 01.05.2015
comment
Отличный ответ, но только для Linux. Не будет работать в Windows. stackoverflow.com/questions/10807164/ - person ExactaBox; 07.07.2015
comment
ValueError: Недопустимая строка формата - person gene b.; 28.05.2021
comment
@Amin Shah Gilani, это альтернатива, производная от Linux, я обновил сообщение, чтобы указать ссылку на происхождение этой конкретной функции реализации. - person ChrisFreeman; 29.05.2021

Новая система форматирования строк предоставляет альтернативу 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 года.

person senderle    schedule 02.03.2012
comment
Он существует с Python 2.6. (Это не такое новое.) - person senderle; 02.03.2012
comment
Например, чтобы указать месяц, вы можете использовать следующее: "{0.day} {0:%B %Y}".format(d), что даст вам '2 August 2013' в качестве дня этого комментария :) - person Jens; 01.08.2013
comment
Это интересно, но на самом деле это не отвечает OP, потому что ему нужны часы AM/PM. На самом деле я не собираюсь понижать его, но принятый ответ на самом деле правильный, если вы пытаетесь получить американское форматирование даты и времени в python. - person Dana Cartwright; 04.04.2014
comment
Обратите внимание, что этот метод использует strftime, который не будет работать с датами до 1900 года. Если у вас есть старые даты, вы об этом пожалеете. - person mlissner; 06.04.2016
comment
@mlissner, этот метод =› последний метод - первые два не используют strftime. - person senderle; 07.04.2016
comment
@senderle Хороший вопрос. Удивительно насквозь, так как самого strftime не видно. - person mlissner; 07.04.2016
comment
фак! Я только что понял, где я не указывал d на другой объект, я просто передал его как позиционный аргумент. - person JacobIRR; 27.07.2018

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

В 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.

person Community    schedule 10.03.2017
comment
Это верно. Однако обратите внимание, что # хеш-трюк в Windows доступен только для собственных исполняемых файлов Python. Другими словами, это не будет работать для реализации Python на основе cygwin. - person sagneta; 14.03.2017
comment
Вау, это здорово знать, но я в ужасе от последствий. Я тестирую форматирование даты, возвращаемое из базы данных, и мне нужно передать ожидаемое форматирование для каждого теста, и это добавляет массу сложностей. - person Keith; 14.02.2018

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

На окнах это:

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

Подумал, что может помочь.

person user3685285    schedule 01.11.2016

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

Python strftime - дата без ведущего 0?

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

person Rob Cranfill    schedule 11.07.2020
comment
pd.to_datetime(dt['Time'], format= '%l:%M:%S', infer_datetime_format=True) После попытки %l у меня все еще не работает Ошибка: - Файл pandas_libs\tslibs\conversion.pyx, строка 399, в pandas._libs.tslibs.conversion.convert_datetime_to_tsobject Файл pandas_libs\tslibs\np_datetime.pyx, строка 117, в pandas._libs.tslibs.np_datetime.check_dts_bounds pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: за пределами наносекундной метки времени: 1-01-01 09:15:59 - person Ankur Tripathi; 28.11.2020