2011-01-14 39 views
30

Tôi có biến số ngày: 2011-01-15 và tôi muốn nhận lại boolean nếu ngày được cho là trong vòng 3 ngày kể từ TODAY. Im không hoàn toàn chắc chắn làm thế nào để xây dựng này trong Python. Im chỉ xử lý ngày tháng, không phải datetime.Ngày kiểm tra dựa vào phạm vi ngày trong Python

Ví dụ làm việc của tôi là "thời gian gia hạn". Người dùng đăng nhập vào trang web của tôi và nếu thời gian gia hạn là trong vòng 3 ngày kể từ ngày hôm nay, các tập lệnh bổ sung, v.v. bị bỏ qua cho người dùng đó.

Tôi biết bạn có thể thực hiện một số điều thú vị/phức tạp trong mô-đun ngày của Python nhưng tôi không chắc chắn nên tìm ở đâu.

Trả lời

78

Trong Python để kiểm tra một loạt bạn có thể sử dụng a <= x <= b:

>>> import datetime 
>>> today = datetime.date.today() 
>>> margin = datetime.timedelta(days = 3) 

>>> today - margin <= datetime.date(2011, 1, 15) <= today + margin 
True 
+3

+1 Dễ đọc hơn tôi nhiều. – Thomas

+0

Điểm được trao cho Mark Byers. Tôi đồng ý, dễ đọc hơn nhưng không kém phần hợp lệ với câu trả lời của Thomas. Cảm ơn cả hai người. Tôi đã thêm cả hai phương pháp vào Nhật ký của mình. Làm cho cảm giác hoàn hảo. – Flowpoke

+0

Cảm ơn .. Hoàn hảo .. Chính xác những gì tôi đang tìm kiếm .. !! –

7

Trừ hai đối tượng date cung cấp cho bạn đối tượng timedelta, mà bạn có thể so sánh với các đối tượng timedelta khác.

Ví dụ:

>>> from datetime import date, timedelta 
>>> date(2011, 1, 15) - date.today() 
datetime.timedelta(1) 
>>> date(2011, 1, 15) - date.today() < timedelta(days = 3) 
True 
>>> date(2011, 1, 18) - date.today() < timedelta(days = 3) 
False 

Như để "nơi để xem xét": chính thức documentation là tuyệt vời.

+0

Tôi cố gắng này bằng Python 3.1.3 và có được một "Lỗi Cú pháp: thẻ không hợp lệ" khi sử dụng 01 tháng Giêng so với sử dụng 1 tháng Giêng. Vẫn cho bạn số 1 mặc dù ... :) – a2j

+0

Ồ, xin lỗi. Python 2 sẽ giải thích rằng như là bát phân, nhưng chúng đã bỏ cú pháp này trong Python 3 vì nó gây nhầm lẫn. Tôi luôn viết ngày tháng của tôi trong bát phân, phải không? ;) – Thomas

+0

Tôi mới học Python, vì vậy tôi không biết mình làm gì. Tôi hoan nghênh mọi hướng! Vì vậy, tại sao tôi đến SO hàng ngày. – a2j

5

Những người khác có đã hơn đã trả lời đầy đủ, vì vậy không cần thiết phải bỏ phiếu về câu trả lời này.
(Sử dụng kỹ thuật được hiển thị trong Mark Byers 'answer; +1 cho anh ấy).

import datetime as dt 

def within_days_from_today(the_date, num_days=7): 
    ''' 
     return True if date between today and `num_days` from today 
     return False otherwise 

     >>> today = dt.date.today() 
     >>> within_days_from_today(today - dt.timedelta(days=1), num_days=3) 
     False 
     >>> within_days_from_today(dt.date.today(), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=1), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=2), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=3), num_days=3) 
     True 
     >>> within_days_from_today(today + dt.timedelta(days=4), num_days=3) 
     False 
    ''' 
    lower_limit = dt.date.today() 
    upper_limit = lower_limit + dt.timedelta(days=num_days) 
    if lower_limit <= the_date <= upper_limit: 
     return True 
    else: 
     return False 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
+0

Tôi cũng thích điều này. Tôi thích sự hỗ trợ cho thấp hơn và trên, như tôi có thể không muốn đếm một ngày trước ngày hôm nay. Hoàn thành với doctest! ;) – Flowpoke

0

Object định hướng giải pháp

import datetime 

class DatetimeRange: 
    def __init__(self, dt1, dt2): 
     self.dt1 = dt1 
     self.dt2 = dt2 

    def __contains__(self, dt): 

     if dt > dt1 and dt < dt2: 
      return True 
     else: 
      return False 

dt1 = datetime.datetime.now() 
dt2 = dt1 + datetime.timedelta(days = 2) 
test_true = dt1 + datetime.timedelta(days = 1) 
test_false = dt1 + datetime.timedelta(days = 5) 

test_true in DatetimeRange(dt1, dt2) #Returns True 
test_false in DatetimeRange(dt1, dt2) #Returns False 
Các vấn đề liên quan