Получить «2:35 вечера» вместо «02:35 PM» из даты / времени Python? - PullRequest
27 голосов
/ 28 мая 2010

Я все еще немного медленен с Python, так что я не понял этого сверх того, что очевидно в документации и т. Д.

Я немного поработал с Django, где они добавили некоторые параметры форматирования даты и времени через теги шаблонов, но в обычном коде Python как я могу получить 12-часовой час без ведущий ноль?

Есть ли простой способ сделать это? Я смотрю на документы 2.5 и 2.6 для "strftime ()", и, похоже, для этого случая нет возможности форматирования.

Должен ли я использовать что-то еще?

Не стесняйтесь включать любые другие советы по форматированию времени, которые не очевидны из документов. =)

Ответы [ 8 ]

20 голосов
/ 28 мая 2010

Ничего встроенного в datetime не сделает. Вам нужно будет использовать что-то вроде:

datetime.time(1).strftime('%I:%M%p').lstrip('0')

Добавление

Как указывает @naktinis, он предназначен для использования именно этого параметра strftime. К сожалению, не существует общего решения, если содержимое параметра strftime неизвестно или не указано (например, внешний параметр), поскольку оно становится проблемой «делай, что я имею в виду, а не то, что я говорю».

Таким образом, учитывая, что вы должны знать, что находится в вашем параметре strftime, в более сложном случае вы можете решить это как части:

tval = datetime.time(1)
tval_str = (tval.strftime('%A, %B ') + tval.strftime('%d').lstrip('0') 
    + tval.strftime(' %Y, ') + tval.strftime('%I:%M').lstrip('0') 
    + tval.strftime('%p').lower())

или с модулем re:

tval = datetime.time(1)
tval_str = re.sub(r"^0|(?<=\s)0", "", 
    re.sub(r"(?<=[0-9])[AP]M", lambda m: m.group().lower(), 
    tval.strftime('%A, %B %d %Y, %I:%M%p')))

Тем не менее, имейте в виду, что если термин "%p" дает вам заглавные буквы, это может быть связано с тем, что пользователь настраивает свою локаль таким образом, и при изменении регистра вы переопределяете пользовательские настройки, что иногда приводит к отчеты. Кроме того, пользователь может захотеть что-то отличное , кроме «am» или «pm», например «a.m.» и "п.м." Также обратите внимание, что они отличаются для разных локалей (например, en_US локаль дает AM или PM для %p, но de_DE дает am или pm), и вы можете не получать символы в вы принимаете кодировку.

Из документации о поведении strftime :

Поскольку формат зависит от текущей локали, следует соблюдать осторожность, делая предположения о выходном значении. Порядок полей будет различаться (например, «месяц / день / год» и «день / месяц / год»), и выходные данные могут содержать символы Юникода, закодированные с использованием кодировки по умолчанию для локали (например, если текущая локаль js_JP кодировка по умолчанию может быть любой из eucJP, SJIS или utf-8; используйте locale.getlocale() для определения кодировки текущей локали).

Итак, короче говоря, если вы считаете, что вам нужно переопределить настройки локали, убедитесь, что у вас есть веская причина, чтобы не создавать новые ошибки.

13 голосов
/ 18 сентября 2012

На этот вопрос уже был дан ответ, но технически вы можете получить "14:35" напрямую из даты Python с .strftime("%-I:%M%P") на платформах Linux, использующих glibc, потому что Python strftime() использует библиотеку c strftime().

>>> import datetime
>>> now = datetime.datetime.now()
datetime.datetime(2012, 9, 18, 15, 0, 30, 385186)
>>> now.strftime("%-I:%M%P")
'3:00pm'
>>> datetime.time(14, 35).strftime("%-I:%M%P")
'2:35pm'

См. strftime glibc notes для "-" .

7 голосов
/ 28 мая 2010

Хотя я неравнодушен к ответу Майка ДеСимона , для голосования я думаю, что это может быть полезным вкладом ...

Проект Django содержит класс форматирования даты, совместимый с PHP: django / utils / dateformat.py (trunk) . Используется так (пример оболочки):

>>> import datetime
>>> from django.utils.dateformat import DateFormat
>>> d = datetime.datetime.now()
>>> df =  DateFormat(d)
>>> df.format('g:ia') # Format for Hour-no-leading-0, minutes, lowercase 'AM/PM'
u'9:10a.m.'

Это отвечает требованиям здесь, и может быть стоит включить в ваш проект. При этом я скажу, что вы должны проверить, разрешает ли лицензия такое использование ... Любые комментарии для уточнения приветствуются.

4 голосов
/ 01 ноября 2015

Python's strftime() гарантированно поддерживаются только коды формата от C89 (см. список ).

Полезные коды дополнительного формата определены другими стандартами (см. справочная страница Linux для strftime()). На этот вопрос соответствующие дополнительные коды:

  • %l - час (12-часовой формат) в виде десятичного числа (от 1 до 12).
  • %P - Как и %p, но в нижнем регистре: «am» или «pm» или соответствующая строка для текущей локали.

Мне нравится использовать функцию-оболочку вокруг strftime() для реализации дополнительных кодов:

def extendedStrftime(dt, format):

    day  = dt.strftime('%d').lstrip('0')
    hour = dt.strftime('%I').lstrip('0')
    ampm = dt.strftime('%p').lower()

    format = format.replace('%e', day)
    format = format.replace('%l', hour)
    format = format.replace('%P', ampm)

    return dt.strftime(format)

Чтобы получить вывод в формате «2:35 pm»:

extendedStrftime(dt, '%l:%M%P')

Также очень часто хочется форматировать день без начального нуля , что можно сделать с помощью дополнительного кода %e:

extendedStrftime(dt, '%e %b %Y')  # "1 Jan 2015"
2 голосов
/ 28 мая 2010

Используйте %l, чтобы получить час как число от 1..12:

In [2]: datetime.time(hour=14,minute=35).strftime('%l:%M%p')
Out[2]: ' 2:35PM'

Дополнительные коды форматов см. http://au2.php.net/strftime.

2 голосов
/ 28 мая 2010
Объекты

datetime.time предоставляют поля hour, minute и second. Создание собственного формата с этим довольно тривиально. Как то так:

return "%d:%02d %s" % (foo.hour % 12 + 0 if foo.hour % 12 else 12, #ugh
                       foo.minute,
                       "pm" if foo.hour >= 12 else "am")
1 голос
/ 28 мая 2010

Я знаю, что это довольно дешево, но вы могли бы просто отказаться от первого символа, если он равен нулю:)

0 голосов
/ 24 октября 2011

Небольшой взлом, который я использовал:

# a time object
mytime = time(hour=time_hour, minute=time_minute)
# return a time as a string without a leading zero in hours.
return "%s:%s" % (mytime.hour, mytime.strftime("%M"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...