2012-04-03 15 views
15

Tôi đang xây dựng một loại ứng dụng web lịchTrong python, làm thế nào để kiểm tra xem một ngày có hợp lệ không?

tôi đã thiết lập các hình thức sau đây trong HTML

<form action='/event' method='post'> 
Year ("yyyy"): <input type='text' name='year' /> 
Month ("mm"): <input type='text' name='month' /> 
Day ("dd"): <input type='text' name='day' /> 
Hour ("hh"): <input type='text' name='hour' /> 
Description: <input type='text' name='info' /> 
      <input type='submit' name='submit' value='Submit'/> 
</form> 

Các đầu vào từ người dùng sau đó được đệ trình trong máy chủ một CherryPy

Tôi tự hỏi, có cách nào để kiểm tra xem ngày được người dùng nhập có phải là ngày hợp lệ không?

Rõ ràng là tôi có thể viết rất nhiều câu lệnh if, nhưng có chức năng tích hợp nào có thể kiểm tra điều này không?

Cảm ơn

+0

Liên quan: [Làm cách nào để xác thực định dạng chuỗi ngày trong python?] (Http://stackoverflow.com/q/16870663) – kenorb

Trả lời

18

Bạn có thể cố gắng làm

import datetime 
datetime.datetime(year=year,month=month,day=day,hour=hour) 

rằng sẽ loại bỏ somethings như tháng> 12, giờ> 23, leapdays không tồn tại (tháng = 2 có tối đa là 28 năm nhuận thuốc, 29 trường hợp , các tháng khác có tối đa 30 hoặc 31 ngày) (ném ngoại lệ ValueError về lỗi)

Ngoài ra, bạn có thể thử so sánh nó với một số giới hạn trên/dưới lành mạnh. ví dụ:

datetime.date(year=2000, month=1,day=1) < datetime.datetime(year=year,month=month,day=day,hour=hour) <= datetime.datetime.now() 

Giới hạn trên và dưới có liên quan phụ thuộc vào nhu cầu của bạn.

chỉnh sửa: hãy nhớ rằng điều này không xử lý datetimes nhất định điều đó có thể không có giá trị ứng dụng của bạn

3

Sử dụng datetime

ví dụ.

>>> from datetime import datetime 
>>> print datetime(2008,12,2) 
2008-12-02 00:00:00 
>>> print datetime(2008,13,2) 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    print datetime(2008,13,2) 
ValueError: month must be in 1..12 
+0

Nhưng điều đó sẽ không cho tôi một thông báo lỗi? và khiến mọi thứ sụp đổ? Tôi đã hy vọng nếu có một hàm cho exampel, trả về 1 nếu đó là ngày hợp lệ và trả về 0 nếu nó không hợp lệ. Sau đó, tôi có thể nhắc người dùng nhập lại ngày vào trang web. – Synia

+1

Hoặc bạn có thể 'thử ... trừ' và bắt lỗi. Sau đó, bạn có thể làm những gì bạn muốn, vượt qua lỗi âm thầm nếu bạn chọn. – jamylak

+1

xem http://docs.python.org/tutorial/errors.html#handling-exceptions –

21

Bạn có thể thử sử dụng datetime và xử lý các trường hợp ngoại lệ (min sinh nhật, ngày lễ, ngoài giờ hoạt động, vv.) để quyết định ngày hợp lệ/không hợp lệ: Ví dụ: http://codepad.org/XRSYeIJJ

import datetime 
correctDate = None 
try: 
    newDate = datetime.datetime(2008,11,42) 
    correctDate = True 
except ValueError: 
    correctDate = False 
print(str(correctDate)) 
-1

vì vậy, đây là giải pháp hacky của tôi để sửa chữa cho những ngày không hợp lệ được cung cấp. Điều này giả định người dùng đang gửi từ biểu mẫu html chung cung cấp ngày 1-31 làm tùy chọn. Vấn đề chính là người dùng cung cấp ngày không tồn tại trong tháng (ví dụ: 31 tháng 9)

def sane_date(year, month, day): 
    # Calculate the last date of the given month 
    nextmonth = datetime.date(year, month, 1) + datetime.timedelta(days=35) 
    lastday = nextmonth.replace(day=1) - datetime.timedelta(days=1) 
    return datetime.date(year, month, min(day, lastday.day)) 

class tests(unittest.TestCase): 

    def test_sane_date(self): 
     """ Test our sane_date() method""" 
     self.assertEquals(sane_date(2000,9,31), datetime.date(2000,9,30)) 
     self.assertEquals(sane_date(2000,2,31), datetime.date(2000,2,29)) 
     self.assertEquals(sane_date(2000,1,15), datetime.date(2000,1,15)) 
1

Đây là giải pháp sử dụng thời gian.

import time 
def is_date_valid(year, month, day): 
    this_date = '%d/%d/%d' % (month, day, year) 
    try: 
     time.strptime(this_date, '%m/%d/%Y') 
    except ValueError: 
     return False 
    else: 
     return True 
+1

tại sao bạn sẽ làm điều đó thay vì chỉ 'ngày (năm, tháng, ngày)'? – jfs

1

Bạn có thể thử sử dụng datetime và xử lý các trường hợp ngoại lệ để quyết định hợp lệ/ngày không hợp lệ:

import datetime 

def check_date(year, month, day): 
    correctDate = None 
    try: 
     newDate = datetime.datetime(year, month, day) 
     correctDate = True 
    except ValueError: 
     correctDate = False 
    return correctDate 

#handles obvious problems 
print(str(check_date(2008,11,42))) 

#handles leap days 
print(str(check_date(2016,2,29))) 
print(str(check_date(2017,2,29))) 

#handles also standard month length 
print(str(check_date(2016,3,31))) 
print(str(check_date(2016,4,31))) 

gives

False 
True 
False 
True 
False 

Đây là cải thiện an answer by DhruvPathak và ý nghĩa hơn dưới dạng bản chỉnh sửa nhưng bị từ chối là "This edit was intended to address the author of the post and makes no sense as an edit. It should have been written as a comment or an answer."

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