Получить “14:35” вместо “14:35” с даты/времени Python?

Я являюсь все еще немного медленным с Python, таким образом, я не имею, это выяснило вне того, что находится, очевидно, в документах и т.д.

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

Существует ли простой способ сделать это? Я смотрю на 2,5 и 2,6 документа для "strftime ()" и там, кажется, не параметр форматирования там для этого случая.

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

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

28
задан anonymous coward 27 May 2010 в 21:48
поделиться

5 ответов

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

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

Addendum

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

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

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

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

20
ответ дан 28 November 2019 в 03:15
поделиться

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

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

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

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

7
ответ дан 28 November 2019 в 03:15
поделиться

datetime.time объекты раскрывают поля час, минута и секунда. Создание собственного форматирования с их помощью довольно тривиально. Что-то вроде этого:

return "%d:%02d %s" % (foo.hour % 12 + 0 if foo.hour % 12 else 12, #ugh
                       foo.minute,
                       "pm" if foo.hour >= 12 else "am")
2
ответ дан 28 November 2019 в 03:15
поделиться

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

1
ответ дан 28 November 2019 в 03:15
поделиться

Используйте % 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 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: