Python формат datetime с "st", "nd", "rd", "th" (английский порядковый суффикс), как PHP "S"
Мне бы хотелось, чтобы объект datetime python выводил (и использовал результат в django) следующим образом:
Thu the 2nd at 4:30
Но я не нашел пути в python для вывода st
, nd
, rd
или th
, как я могу, с форматом даты и времени PHP с строкой S
(Что они называют "Английский ординарный суффикс", ) (http://uk.php.net/manual/en/function.date.php).
Есть ли встроенный способ сделать это в django/python? strftime
недостаточно хорош (http://docs.python.org/library/datetime.html#strftime-strptime-behavior).
Django имеет фильтр, который делает то, что я хочу, но я хочу, чтобы функция, а не фильтр, выполняла то, что я хочу. Либо функция django, либо python будет в порядке.
Ответы
Ответ 1
django.utils.dateformat имеет функцию format
, которая принимает два аргумента, первая из которых является датой (a datetime.date
[[или datetime.datetime
]], где datetime
- это модуль в стандартной библиотеке Python), второй - строка формата и возвращает полученную форматированную строку. Элемент форматирования верхнего регистра - S
(если, конечно, часть строки формата) - это тот, который расширяется до правильного значения "st", "nd", "rd" или "th", от месяца указанной даты.
Ответ 2
Не знаю о встроенном, но я использовал это...
def ord(n):
return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th"))
и
def dtStylish(dt,f):
return dt.strftime(f).replace("{th}", ord(dt.day))
Ответ 3
Вы можете сделать это просто, используя библиотеку гуманизации
from django.contrib.humanize.templatetags.humanize import ordinal
Затем вы можете просто дать ординал любое целое число, т.е.
ordinal(2)
вернет 2nd
Ответ 4
Вот код fancier:
def date_extention(number):
if number%10 == 1:
return '%dst' % number
if number%10 == 2:
return '%dnd' % number
if number%10 == 3:
return '%drd' % number
if (number%10 >= 4) or (number%10== 0):
return '%dth' % number
Кстати, это работает с любым числом, поэтому я рекомендую вам сделать модуль из него. Особенно, если вы делаете много введенных пользователем программ...