2010-09-04 7 views
13

Je voudrais qu'un objet datetime python soit édité (et utilise le résultat dans django) comme ceci:python format datetime avec "st", "nd", "rd", "th" (suffixe ordinale anglais) comme "S" de PHP

Thu the 2nd at 4:30 

Mais je ne trouve aucune façon python à la sortie st, nd, rd ou th comme je peux avec le format datetime PHP avec la chaîne S (ce qu'ils appellent "l'anglais ordinal Suffixe") (http://uk.php.net/manual/en/function.date.php) .

Existe-t-il un moyen intégré de faire cela dans django/python?strftime n'est pas assez bon (http://docs.python.org/library/datetime.html#strftime-strptime-behavior). Django a un filtre qui fait ce que je veux, mais je veux une fonction, pas un filtre, pour faire ce que je veux. Soit une fonction django ou python sera bien.

+0

Si vous ne trouvez pas de solution prête à l'emploi, voici quelques-unes que vous pouvez convertir: http://stackoverflow.com/questions/165713/how-do-i-provide-a -suffix-pour-jours-de le mois – paxdiablo

Répondre

23

Le django.utils.dateformat a une fonction format qui prend deux arguments, la première étant la date (une datetime.date [[ou datetime.datetime]] exemple, où datetime est le module dans la bibliothèque standard de Python), la seconde étant la chaîne de format et renvoie la chaîne formatée résultante. L'élément de format en majuscule S (s'il fait partie de la chaîne de format, bien sûr) est celui qui se développe en celui qui convient à 'st', 'nd', 'rd' ou 'th', selon le jour de la mois de la date en question.

11

ne sais pas à propos, mais je construite en ... utilisé ce

def ord(n): 
    return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th")) 

et:

def dtStylish(dt,f): 
    return dt.strftime(f).replace("{th}", ord(dt.day)) 
+0

Quel est le point de '" th "si 4 <= n% 100 <= 20'? l'autre partie couvrira tous les cas. – Arijoon

+4

@Arijoon Cette partie couvre les «adolescents, qui ne suivent pas les mêmes règles que tout le reste. Si vous le supprimez, vous obtiendrez '11st' ou' 13rd' quand ils devraient être '11th' et' 13th'. – Status

-1

Voici le code colombophile:

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 

Par la façon dont fonctionne ce avec n'importe quel nombre, donc je vous recommande d'en faire un module. Surtout si vous faites beaucoup de programmes inputed utilisateur ...

+2

"cela fonctionne avec n'importe quel nombre" jusqu'à ce que vous atteigniez les 11, 12 et 13. – Holloway

3

Vous pouvez le faire simplement en utilisant la bibliothèque humanize

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

Vous pouvez alors simplement donner ordinale tout entier, soit

ordinal(2) renverra 2nd