l10n datetimefield php python django datetime format

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'')