2011-11-24 42 views
77

Cách ngắn nhất để xem có bao nhiêu ngày đã trôi qua giữa hai ngày? Đây là những gì tôi đang làm bây giờ.Ngày giữa hai ngày trong Python

math.floor((b - a).total_seconds()/float(86400)) 
+1

Chỉ là hai ngày hoặc chúng có bao gồm thông tin thời gian không? –

+1

Ah - xem thêm http://stackoverflow.com/questions/151199/how-do-i-calculate-number-of-days-betwen-two-dates-using-python –

Trả lời

146

Giả sử bạn đã theo nghĩa đen có hai đối tượng ngày, bạn có thể trừ một từ khác và truy vấn kết quả timedelta object cho số ngày:

>>> from datetime import date 
>>> a = date(2011,11,24) 
>>> b = date(2011,11,17) 
>>> a-b 
datetime.timedelta(7) 
>>> (a-b).days 
7 

Và nó hoạt động với datetimes quá - Tôi nghĩ rằng nó làm tròn xuống đến một ngày gần nhất:

>>> from datetime import datetime 
>>> a = datetime(2011,11,24,0,0,0) 
>>> b = datetime(2011,11,17,23,59,59) 
>>> a-b 
datetime.timedelta(6, 1) 
>>> (a-b).days 
6 
+1

Sự mát mẻ. Bằng cách nào đó tôi luôn luôn giả định "ngày" chỉ đề cập đến phần ngày của sự khác biệt. Vì vậy, ví dụ sự khác biệt giữa năm 2010 và 2011 sẽ là 0 ngày và 1 năm, nhưng hóa ra nó báo cáo 365 ngày như tôi muốn. – Bemmu

+0

@Bemmu: ah vâng - Tôi nghĩ rằng 'timedelta' không báo cáo bất kỳ đơn vị nào lâu hơn ngày (mặc dù tôi có thể sai). –

4

Hãy thử:

(b-a).days 

Tôi đã thử với b và một loại datetime.date.

28

Bạn có nghĩa là ngày theo lịch đầy đủ hoặc nhóm 24 giờ?

Đối với chỉ đơn giản là 24 giờ, giả sử bạn đang sử dụng datetime Python, sau đó đối tượng timedelta đã có một ngày bất động sản:

days = (a - b).days 

Đối ngày dương lịch, bạn sẽ cần phải làm tròn xuống đến một ngày gần nhất , và b đến ngày gần nhất, loại bỏ một phần ngày ở hai bên:

roundedA = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
roundedB = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
days = (roundedA - roundedB).days 
+3

vị trí tốt với sự khác biệt trong ngày lịch và 24 giờ. Một câu hỏi là tại sao bạn thêm 1 ngày. Tôi nghĩ rằng các công trình trên hoàn hảo mà không có nó. –

+0

Đó là séc cho các ngày theo lịch. Nói A là 2013-06-18 lúc 16:00 và B là 2013-06-19 lúc 02:00; một ngày dương lịch đã trôi qua, nhưng (B - A) .ngày sẽ trở về số không vì đồng bằng chỉ là 10 giờ. – DNS

+0

Đó là điểm tôi đang làm cho DNS của bạn trả về mã 2 vì bạn đã thêm một ngày khác. Nếu không thêm 1 ngày, nó sẽ trả về 1. Tại sao thêm một ngày? –

4

Tham khảo ý kiến ​​của tôi về câu trả lời khác. Đây là cách tôi sẽ làm việc ra sự khác biệt trong ngày dựa trên 24 giờ và ngày lịch. thuộc tính days hoạt động tốt trong 24 giờ và chức năng hoạt động tốt nhất để kiểm tra lịch.

from datetime import timedelta, datetime 

def cal_days_diff(a,b): 

    A = a.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
    B = b.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 
    return (A - B).days 

if __name__ == '__main__': 

    x = datetime(2013, 06, 18, 16, 00) 
    y = datetime(2013, 06, 19, 2, 00) 

    print (y - x).days   # 0 
    print cal_days_diff(y, x) # 1 

    z = datetime(2013, 06, 20, 2, 00) 

    print (z - x).days   # 1 
    print cal_days_diff(z, x) # 2 
Các vấn đề liên quan