datetimefield - Formato de Python datetime con "st", "nd", "rd", "th"(sufijo ordinal en inglés) como la "S" de PHP
format() django (6)
Me gustaría que un objeto datetime de Python se imprima (y use el resultado en django) de esta manera:
Thu the 2nd at 4:30
Pero no encuentro la forma en Python de generar st
, nd
, rd
, o th
como puedo con el formato datetime de PHP con la cadena S
(lo que ellos llaman "Sufijo Ordinal Inglés") ( http://uk.php.net/manual/en/function.date.php ).
¿Hay una forma integrada de hacer esto en django / python? strftime
no es lo suficientemente bueno ( http://docs.python.org/library/datetime.html#strftime-strptime-behavior ).
Django tiene un filtro que hace lo que quiero, pero quiero una función, no un filtro, para hacer lo que quiero. Una función django o python estará bien.
Acabo de escribir una pequeña función para resolver el mismo problema dentro de mi propio código:
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]
Aquí está el código más elegante:
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
Por cierto, esto funciona con cualquier número, así que te recomiendo que hagas un módulo con él. Especialmente si haces muchos programas ingresados por el usuario ...
El django.utils.dateformat tiene un format
función que toma dos argumentos, el primero es la fecha (una instancia de datetime.date
[[o datetime.datetime
]], donde datetime
es el módulo en la biblioteca estándar de Python), el segundo siendo la cadena de formato, y devuelve la cadena formateada resultante. El elemento de formato en mayúscula (si es parte de la cadena de formato, por supuesto) es el que se expande al correcto de ''st'', ''nd'', ''rd'' o ''th'', dependiendo del día de Mes de la fecha en cuestión.
No sé acerca de construido en pero utilicé esto ...
def ord(n):
return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th"))
y:
def dtStylish(dt,f):
return dt.strftime(f).replace("{th}", ord(dt.day))
Puedes hacer esto simplemente usando la biblioteca humanizar
from django.contrib.humanize.templatetags.humanize import ordinal
A continuación, puede simplemente dar cualquier número entero ordinal, es decir
ordinal(2)
volverá 2nd
Siguiente solución que tengo para el problema anterior:
datetime.strptime(mydate, ''%dnd %B %Y'')
datetime.strptime(mydate, ''%dst %B %Y'')
datetime.strptime(mydate, ''%dth %B %Y'')
datetime.strptime(mydate, ''%drd %B %Y'')