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

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