2013-04-15 12 views
11

Nói rằng tôi có một lớp trong mô hìnhDjango: Làm thế nào để có được một sự khác biệt thời gian từ thời gian đăng bài?

class Post(models.Model): 
    time_posted = models.DateTimeField(auto_now_add=True, blank=True) 

    def get_time_diff(self): 
     timediff = timediff = datetime.datetime.now() - self.time_posted 
     print timediff # this line is never executed 
     return timediff 

tôi xác định một get_time_diff để có được sự khác biệt thời gian từ thời điểm bài viết được đăng tải cho đến nay, theo các tài liệu, các DateTimeField sẽ có thể được chuyển đổi để datetime tự động, đó là chính xác? Tại sao lệnh in không bao giờ được chạy? Làm thế nào bạn có thể trích xuất sự khác biệt thời gian?

Bên cạnh đó, nếu bạn có sự khác biệt về thời gian, có cách dễ dàng để chuyển đổi chênh lệch thời gian thành số nguyên, như số giây của tổng thời gian không.

+0

Đây là cũ, nhưng tôi nhận thấy không có ai trả lời câu hỏi của bạn về in ấn. Bản in của bạn có thể đang hoạt động nhưng bạn sẽ không thấy nó trên trang web của mình. in chỉ hoạt động trong bảng điều khiển. Nếu bạn nhìn vào nhật ký, bạn sẽ tìm thấy thông báo in của mình. – ryechus

Trả lời

26

Mã của bạn đã hoạt động; a datetime.timedelta object được trả lại.

Để có được tổng số giây thay vào đó, bạn cần phải gọi .total_seconds() method trên kết quả timedelta:

from django.utils.timezone import utc 

def get_time_diff(self): 
    if self.time_posted: 
     now = datetime.datetime.utcnow().replace(tzinfo=utc) 
     timediff = now - self.time_posted 
     return timediff.total_seconds() 

.total_seconds() trả về một giá trị float, bao gồm micro giây.

Lưu ý rằng bạn cần phải sử dụng một múi giờ biếtdatetime đối tượng, kể từ khi Django DateTimeField xử lý múi giờ biết datetime đối tượng là tốt. Xem Django Timezones documentation.

Trình diễn .total_seconds() (với ngây thơ datetime đối tượng, nhưng những nguyên tắc đều giống nhau):

>>> import datetime 
>>> time_posted = datetime.datetime(2013, 3, 31, 12, 55, 10) 
>>> timediff = datetime.datetime.now() - time_posted 
>>> timediff.total_seconds() 
1304529.299168 

Bởi vì cả hai đối tượng là múi giờ nhận thức được (có một thuộc tính .tzinfo đó không phải là None), tính toán giữa họ chăm sóc của các múi giờ và trừ đi một múi giờ với nhau sẽ làm điều đúng đắn khi tính đến các múi giờ của một trong hai đối tượng.

+0

+1 - Không biết về phương thức 'total_seconds()'. :) – Aya

+0

Cảm ơn trước nhưng trong trường hợp của tôi time_posted là một DateTimeField. Tôi đã thử, nó không hoạt động. – dorafmon

+0

@dorafmon: trong phương thức mô hình tùy chỉnh của bạn 'self.time_posted' trả về một cá thể' datetime', xem [Phương thức mô hình] (https://docs.djangoproject.com/en/1.5/topics/db/models/#model- phương pháp). –

0

Mã của bạn

timediff = datetime.datetime.now() - self.pub_date 

nên làm việc để có được sự khác biệt thời gian. Tuy nhiên, điều này trả về đối tượng timedelta. Để có sự khác biệt về số giây bạn sử dụng .seconds thuộc tính

timediff = datetime.datetime.now() - self.pub_date 
timediff.seconds # difference in seconds. 
+0

Tôi không nghĩ rằng sẽ làm việc nếu sự khác biệt là nhiều hơn một ngày. – Aya

+0

@Aya, tôi nghĩ là vậy. Bạn có biết tại sao nó không? – Rohan

+0

Vâng, [các tài liệu] (http://docs.python.org/2/library/datetime.html) nói rằng thuộc tính 'giây' là" Giữa 0 và 86399 đã bao gồm ". – Aya

3

Giả sử bạn đang thực hiện việc này trong mẫu, bạn cũng có thể sử dụng thẻ mẫu timesince.

Ví dụ:

{{ blog_date|timesince:comment_date }}