Я бы хотел, чтобы объект даты и времени Python выводил (и использовал результат в django) следующим образом:
Thu the 2nd at 4:30
Но я не нахожу в Python способа вывода st, nd, rd или th, как я могу с форматом даты и времени PHP со строкой S (что они называют «английский порядковый суффикс» ) (http://uk.php.net/manual/en/function.date.php).
st
nd
rd
th
S
Есть ли встроенный способ сделать это в django / python? strftime недостаточно хорошо (http://docs.python.org/library/datetime.html#strftime-strptime-behavior).
strftime
У Django есть фильтр, который делает то, что я хочу, но я хочу, чтобы функция, а не фильтр, делала то, что я хочу. Подойдет либо функция django, либо python.
django.utils.dateformat имеет функцию format, которая принимает два аргумента, первый из которых является датой (экземпляр datetime.date [[или datetime.datetime]], где datetime - это модуль в стандартной библиотеке Python), второй является строкой формата и возвращает полученную отформатированную строку. Элемент формата в верхнем регистре - S (если, конечно, часть строки формата) - это тот, который расширяется до правильных значений 'st', 'nd', 'rd' или 'th', в зависимости от дня- месяца указанной даты.
format
datetime.date
datetime.datetime
datetime
не знаю о встроенном, но я использовал это ...
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))
Вы можете сделать это просто с помощью библиотеки humanize
from django.contrib.humanize.templatetags.humanize import ordinal
После этого вы можете просто дать порядковому порядку любое целое число, т.е.
ordinal(2) вернется 2nd
ordinal(2)
2nd
Следующее решение, которое я получил для вышеуказанной проблемы:
datetime.strptime(mydate, '%dnd %B %Y') datetime.strptime(mydate, '%dst %B %Y') datetime.strptime(mydate, '%dth %B %Y') datetime.strptime(mydate, '%drd %B %Y')
Я только что написал небольшую функцию для решения той же проблемы в своем собственном коде:
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]
Вот интересный код:
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
Кстати, это работает с любым числом, поэтому я рекомендую вам сделать из него модуль.Особенно, если вы делаете много пользовательских программ ...