Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Ничто не будет встроено в 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 locale дает AM или PM для %p, но de_DE дает AM или PM), и вы можете не получать символы в кодирование, которое вы принимаете.

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

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

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

Ответ 2

Этот вопрос уже ответил, но вы можете технически получить "2:35 pm" непосредственно из даты и времени 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 на "-" .

Ответ 3

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

Проект Django содержит класс форматирования даты "PHP Compatible" в 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

Python 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"

Ответ 5

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")

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

# 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"))