2010-09-04 8 views
13

Vorrei un oggetto datetime python da restituire (e usare il risultato in django) come questo:formato python datetime con "st", "nd", "rd", "th" (suffisso ordinale inglese) come "S" di PHP

Thu the 2nd at 4:30 

Ma trovo alcun modo in Python per uscita st, nd, rd, o th come posso con formato PHP datetime con la stringa S (quello che chiamano "inglese ordinale suffisso") (http://uk.php.net/manual/en/function.date.php) .

C'è un modo integrato per farlo in django/python?strftime non è abbastanza buono (http://docs.python.org/library/datetime.html#strftime-strptime-behavior).

Django ha un filtro che fa quello che voglio, ma voglio una funzione, non un filtro, per fare ciò che voglio. O una funzione django o python andrà bene.

+0

Se non trovi una soluzione già pronta, ce ne sono alcuni validi qui che puoi convertire: http://stackoverflow.com/questions/165713/how-do-i-provide-a -suffix-per-giorni-di- il mese – paxdiablo

risposta

23

Il django.utils.dateformat ha una funzione format che prende due argomenti, il primo è la data (a [[o datetime.datetime]] esempio datetime.date, dove datetime è il modulo nella libreria standard di Python), la seconda è la stringa di formato e restituisce la stringa formattata risultante. L'articolo in formato maiuscolo-S (se parte della stringa di formato, ovviamente) è quello che si espande a quello corretto di "st", "nd", "rd" o "th", a seconda del giorno di mese della data in questione.

11

Non so circa incorporata, ma ho usato questo ...

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

e:

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

Qual è il punto di "" th "se 4 <= n% 100 <= 20'? l'altra parte coprirà tutti i casi. – Arijoon

+4

@ Arijoon Quella parte riguarda gli adolescenti, che non seguono le stesse regole di tutto il resto. Se lo rimuovi, otterrai '11st' o' 13rd' quando dovrebbero essere '11th' e' 13th'. – Status

-1

Ecco il codice più elaborato:

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 

Tra l'altro questo funziona con qualsiasi numero quindi ti consiglio di farne un modulo. Soprattutto se si fanno un sacco di programmi utente inputed ...

+2

"funziona con qualsiasi numero" fino a raggiungere l'11, il 12 e il 13. – Holloway

3

È possibile farlo semplicemente utilizzando la libreria di umanizzare

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

È quindi possibile solo dare ordinale qualsiasi numero intero, vale a dire

ordinal(2) restituirà 2nd

Problemi correlati