2010-09-04 57 views
13

Tôi muốn một đối tượng datthon datetime để xuất (và sử dụng kết quả trong django) như này:datthon định dạng datetime với "st", "nd", "rd", "th" (tiếng anh thứ tự hậu tố) như PHP "S"

Thu the 2nd at 4:30 

Nhưng tôi thấy không có cách nào trong python để đầu ra st, nd, rd, hoặc th như tôi có thể với định dạng PHP datetime với S string (những gì họ gọi là "tiếng Anh TT Suffix") (http://uk.php.net/manual/en/function.date.php) .

Có cách tích hợp để thực hiện việc này bằng django/python không?strftime không đủ tốt (http://docs.python.org/library/datetime.html#strftime-strptime-behavior).

Django có bộ lọc làm những gì tôi muốn, nhưng tôi muốn có chức năng, không phải bộ lọc, để làm những gì tôi muốn. Hoặc là một django hoặc python chức năng sẽ được sử dụng tốt.

+0

Nếu bạn không tìm thấy giải pháp làm sẵn, có một số giải pháp tốt ở đây bạn có thể chuyển đổi: http://stackoverflow.com/questions/165713/how-do-i-provide-a -suffix-cho-ngày-of- tháng – paxdiablo

Trả lời

23

Các django.utils.dateformat có chức năng format mà phải mất hai đối số, một trong những đầu tiên là ngày (một [[hoặc datetime.datetime]] Ví dụ, datetime.date nơi datetime là module trong thư viện chuẩn của Python), điều thứ hai là chuỗi định dạng và trả về chuỗi được định dạng kết quả. Tất cả các mặt hàng định dạng chữ hoa-S (nếu một phần của chuỗi định dạng) là một phần mở rộng đến một từ 'st', 'nd', 'rd' hoặc 'th', tùy thuộc vào ngày-of- tháng của ngày được đề cập.

11

không biết về xây dựng trong nhưng tôi sử dụng này ...

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

và:

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

Điểm "th" là gì nếu 4 <= n% 100 <= 20'? phần còn lại sẽ bao gồm tất cả các trường hợp. – Arijoon

+4

@Arijoon Phần đó đề cập đến 'thiếu niên, không tuân thủ các quy tắc giống như mọi thứ khác. Nếu bạn xóa nó, bạn sẽ nhận được '11st' hoặc' 13rd' khi chúng phải là '11th' và' 13th'. – Status

-1

Đây là mã fancier:

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 

Bằng cách thức hoạt động này với bất kỳ số nào, vì vậy tôi khuyên bạn nên tạo một mô-đun từ đó. Đặc biệt là nếu bạn thực hiện nhiều chương trình sử dụng inputed ...

+2

"tính năng này hoạt động với bất kỳ số nào" cho đến khi bạn đạt đến 11, 12 và 13. – Holloway

3

Bạn có thể làm điều này đơn giản bằng cách sử dụng thư viện nhân đạo

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

Sau đó bạn có thể chỉ cần cung cấp thứ tự bất kỳ số nguyên, tức là

ordinal(2) sẽ trả về 2nd

Các vấn đề liên quan