Получите «2:35 pm» вместо «02:35 PM» из даты / времени Python?

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

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

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

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

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

  • Отправить файл через сокеты в Python
  • Портативный способ обнаружения количества * полезных * процессоров в Python
  • Clojure Jython interop
  • установка пакетов python в md5
  • Python - функции качения для объекта GroupBy
  • python: использовать windows api для рендеринга текста с использованием шрифта ttf
  • Как открыть изображение из Интернета в PIL?
  • Как установить модуль pywin32 в Windows 7
  • 8 Solutions collect form web for “Получите «2:35 pm» вместо «02:35 PM» из даты / времени Python?”

    Ничто из встроенного в 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», например «am» и «pm». Также обратите внимание, что они различны для разных локалей (например, en_US locale дает AM или PM для %p , но de_DE дает am или pm ), и вы не можете получать символы в кодировке, которую вы предполагаете.

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

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

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

    На этот вопрос уже был дан ответ, но вы можете технически получить «2:35 pm» непосредственно из даты и времени Python с .strftime("%-I:%M%P") на платформах Linux, которые используют glibc, потому что в strftime() Python используется 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' 

    См. Примечания glftce glibc на «-» .

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

    Проект 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.' 

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

    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" 

    Объекты 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") 

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

    Используйте %l чтобы получить час в виде числа между 1..12:

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

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

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

     # 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")) 
    Python - лучший язык программирования в мире.