Я хотел бы, чтобы объект даты и времени Python выводил (и использовал результат в django) следующим образом:

Thu the 2nd at 4:30

Но я не нахожу в Python никакого способа вывести st, nd, rd или th, как я могу, используя формат даты и времени PHP со строкой S (Что они называют «английский порядковый суффикс») (http://uk.php.net/ ручной / EN / function.date.php ) .

Есть ли встроенный способ сделать это в django / python? strftime недостаточно хорош (http://docs.python.org/library/datetime.html#strftime-strptime-behavior).

У Django есть фильтр, который делает то, что я хочу, но я хочу функцию, а не фильтр, чтобы делать то, что я хочу. Подойдет либо функция django, либо python.

22
Alexander Bird 5 Сен 2010 в 03:42

6 ответов

Лучший ответ

django.utils.dateformat имеет функцию {{ X0}}, который принимает два аргумента, первый из которых является датой (экземпляр datetime.date [[или datetime.datetime]], где datetime - модуль в стандартной библиотеке Python), второй один является строкой формата, и возвращает результирующую форматированную строку. Элемент формата в верхнем регистре - S (если, конечно, часть строки формата) - это тот, который расширяется до правильных значений 'st', 'nd', 'rd' или 'th', в зависимости от день месяца указанной даты.

26
Alex Martelli 4 Сен 2010 в 23:55

Следующее решение, которое я получил для вышеупомянутой проблемы:

datetime.strptime(mydate, '%dnd %B %Y')
datetime.strptime(mydate, '%dst %B %Y')
datetime.strptime(mydate, '%dth %B %Y')
datetime.strptime(mydate, '%drd %B %Y')
-1
Tiw 4 Мар 2019 в 08:32

Вы можете сделать это просто с помощью библиотеки humanize

from django.contrib.humanize.templatetags.humanize import ordinal

Затем вы можете просто дать порядковое число любое целое число, т.е.

ordinal(2) вернет 2nd

6
Adrian Krige 25 Окт 2017 в 14:23

Не знаю о встроенном, но я использовал это ...

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))
17
dm03514 6 Дек 2013 в 17:56

Вот причудливый код:

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

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

-1
Gwendal Delisle Arnold 29 Июл 2016 в 18:10

Я только что написал небольшую функцию для решения той же проблемы в моем собственном коде:

def foo(myDate):
    date_suffix = ["th", "st", "nd", "rd"]

    if myDate % 10 in [1, 2, 3] and myDate not in [11, 12, 13]:
        return date_suffix[myDate % 10]
    else:
        return date_suffix[0]
0
Edster 30 Авг 2018 в 09:08