2010-09-04 3 views
13

Chciałbym obiekt datetime Pythona do wyjścia (i użyć wyniku w django) jak to:format datetime python z "st", "nd", "rd", "th" (angielski porządek porządkowy) jak PHP "S"

Thu the 2nd at 4:30 

ale znaleźć nie sposób w Pythonie do wyjścia st, nd, rd lub th jak mogę w formacie PHP datetime z ciągiem S (co nazywają "English porządkową przyrostek") (http://uk.php.net/manual/en/function.date.php) .

Czy jest wbudowany sposób to zrobić w django/Python?strftime nie jest wystarczająco dobre (http://docs.python.org/library/datetime.html#strftime-strptime-behavior).

Django ma filtr, który robi, co chcę, ale chcę funkcję, a nie filtr, aby zrobić to, co chcę. Funkcja django lub python będzie w porządku.

+0

Jeśli nie znajdziesz gotowego rozwiązania, jest kilka dobrych, które możesz tutaj przekonwertować: http://stackoverflow.com/questions/165713/how-do-i-provide-a -suffix-for-days-of- miesiąc – paxdiablo

Odpowiedz

23

django.utils.dateformat posiada funkcję format że przyjmuje dwa argumenty, pierwszy mecz datę (a [[lub datetime.datetime]] instancja datetime.date, gdzie datetime jest moduł w bibliotece standardowej Pythona), drugi jest ciąg formatu i zwraca wynikowy formatowany ciąg. Element formatu uppercase-S (jeśli część ciągu formatu jest oczywiście), to ten, który rozwija się do właściwego "st", "nd", "rd" lub "th", w zależności od dnia miesiąc danej daty.

11

nie wiem o wbudowany ale kiedyś to ...

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

oraz:

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

Jaki jest sens "th", jeśli 4 <= n% 100 <= 20'? część druga obejmie wszystkie przypadki. – Arijoon

+4

@Arijoon Ta część obejmuje "nastolatki, które nie przestrzegają tych samych zasad, co wszystko inne. Jeśli ją usuniesz, otrzymasz '11st' lub' 13rd', kiedy powinny to być '11th' i' 13th'. – Status

-1

Oto hodowcy Kod:

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 

Nawiasem mówiąc to działa z dowolną liczbą, więc zalecamy wykonanie z tego modułu. Zwłaszcza jeśli się wiele programów inputed użytkownika ...

+2

"to działa z dowolną liczbą", aż osiągniesz 11, 12 i 13. – Holloway

3

Można to zrobić tylko za pomocą biblioteki uczłowieczyć

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

Następnie można po prostu dać porządkowej dowolną liczbę całkowitą, tzn

ordinal(2) zwróci 2nd