datetime в формате python с "st", "nd", "rd", "th" (английский порядковый суффикс), как в PHP "S" - PullRequest
17 голосов
/ 05 сентября 2010

Я бы хотел, чтобы объект даты и времени 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.

Ответы [ 6 ]

25 голосов
/ 05 сентября 2010

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

13 голосов
/ 21 мая 2013

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

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))
6 голосов
/ 25 октября 2017

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

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

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

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

0 голосов
/ 04 марта 2019

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

datetime.strptime(mydate, '%dnd %B %Y')
datetime.strptime(mydate, '%dst %B %Y')
datetime.strptime(mydate, '%dth %B %Y')
datetime.strptime(mydate, '%drd %B %Y')
0 голосов
/ 27 августа 2018

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

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 голосов
/ 29 июля 2016

Вот интересный код:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...