2011-03-15 106 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