2011-03-15 37 views
3

我有一個程序,用戶輸入一個日期,然後將它與另一個日期進行比較,以查看哪一個先到達。在Python中處理閏年

我將如何去編寫一個代碼,用戶輸入2月29日,而程序返回2月28日(因爲沒有閏年)?

例子:

def date(prompt): 
''' returns the date that user inputs and validates it''' 
while True: 
    try: 
     date = raw_input(prompt) 
     if len(date) >= 5: 
      month = date[0:2] 
      day = date[3:5] 
     dateObject = datetime.date(2011, int(month), int(day)) 
     return dateObject 
    except ValueError: 
      print "Please enter a valid month and day" 
+0

這聽起來很像我的作業。如果是這樣,請添加作業標籤,並且您更有可能獲得可以幫助您的答案。 – 2011-03-15 23:37:04

+0

在這種情況下,我不會返回一個不同的日期,但告訴用戶該日期不存在,並再次嘗試。你可以使用遞歸。 – Carpetsmoker 2011-03-15 23:54:00

+0

@carpetsmoker我可以做到這一點,但我想讓程序自動輸入一個日期,如果可能的話,可以自動輸入日期爲01年1月或2月28日:) – python1 2011-03-16 00:00:32

回答

4

你如何比較的日期?如果你使用datetime函數,那麼這應該已經解釋了這種東西。

>>> datetime.datetime(2011, 2, 28) 
datetime.datetime(2011, 2, 28, 0, 0) 

>>> datetime.datetime(2011, 2, 29) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: day is out of range for month 

>>> datetime.datetime(1600, 2, 29) 
datetime.datetime(1600, 2, 29, 0, 0) 

datetime.timedelta()被用來表示兩個日期

的區別
>>> datetime.datetime(2011, 2, 28) + datetime.timedelta(days=10) 
datetime.datetime(2011, 3, 10, 0, 0) 

>>> datetime.datetime(1600, 2, 28) + datetime.timedelta(days=10) 
datetime.datetime(1600, 3, 9, 0, 0) 

>>> datetime.datetime(2011, 2, 28) - datetime.datetime(2011, 4, 10) 
datetime.timedelta(-41) 

不知道如何適應你的代碼,但它可能是一種選擇;-)

+0

我不認爲你的代碼適合我的編碼,但是謝謝! :) – python1 2011-03-15 23:31:08

+2

在這種情況下,您可以使用[calender.isleap()](http://docs.python.org/library/calendar.html#calendar.isleap)來檢查給定的年份是否爲閏年... – Carpetsmoker 2011-03-15 23:38:51

2

如果您正在檢查:month == 2 and day == 29它也是多餘的,以檢查它是否爲calendar.isleap()閏年。如果它在非飛躍中設置爲2月29日,則date/datetime將引發ValueError