Получите "2:35 pm" вместо "02:35 PM" из даты/времени Python?
Я все еще немного замешан с Python, поэтому я не понял этого выше того, что очевидно в документах и т.д.
Я немного поработал с Django, где они добавили некоторые параметры форматирования в формате datetime через теги шаблонов, но в регулярном коде python как я могу получить 12-часовой час без начального нуля?
Есть ли простой способ сделать это? Я смотрю документы 2.5 и 2.6 для "strftime()", и, похоже, для этого случая нет форматирования.
Должен ли я использовать что-то еще?
Не стесняйтесь включать любые другие советы по форматированию времени, которые не очевидны из документов. =)
Ответы
Ответ 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"))