我需要帮助将闰年功能添加到我的python程序中

时间:2016-03-21 13:45:39

标签: python python-2.7

import math    
repeat = True    
date = raw_input('Enter a date in the format MM/DD/YYYY') #Prompts user to input    

while repeat:
   date_month = date[0:2] #Takes the input's month and keeps its value for the varible date_month    
   date_day = date[3:5] #Takes the input's day and keeps its value for the varible date_day    
   date_year = date[6:10] #Takes the input's year and keeps its value for the varible date_year       
   if 00 < int(date_month) < 13:    
      if 00 < int(date_day) < 32:    
         if 0000 < int(date_year) < 2017:    
               date = raw_input('The date you entered is valid, enter another date in the format MM/DD/YYYY')               
   else:    
      date = raw_input('invalid date found! Please enter another date in the format MM/DD/YYYY')

4 个答案:

答案 0 :(得分:1)

就这么简单:

>>> import calendar
>>> print(calendar.isleap(1999))
False
>>> print(calendar.isleap(2004))
True

答案 1 :(得分:1)

自己动手解析器代码很傻。 Python has batteries included for this

import datetime

repeat = True    
datestr = raw_input('Enter a date in the format MM/DD/YYYY')

while repeat:
    try:
        # Parse to datetime, then convert to date since that's all you use
        date = datetime.datetime.strptime(datestr, '%m/%d/%Y').date()
    except ValueError:
        pass  # Handle bad dates in common code
    else:
        if 0000 < date.year < 2017:
            datestr = raw_input('The date you entered is valid, enter another date in the format MM/DD/YYYY')
            continue  # Bypass invalid date input common code

    # Both exception and invalid years will fall through to this common code
    datestr = raw_input('invalid date found! Please enter another date in the format MM/DD/YYYY')

显然,正如所写的那样,在任何情况下都不会实际终止循环,但原始代码也不会。这里的优点是strptime可以解决繁重的问题。它通过单个try / except验证原始代码的更多内容,并在没有特殊检查的情况下处理一些月中的棘手问题。您可以像以前一样访问它所解析的year对象的monthdaydate属性,如Python本地int,没有个人{{1你去的转换。

请注意,如果您希望使用区域设置相应的日期表示形式,则您选择的格式恰好与int区域设置匹配,并且您可以通过仅使用{{1}使其更便于非美国用户(尽管你必须使en_US提示符动态匹配);与datetime.datetime.strptime(datestr, '%x')的{​​{1}}的工作方式相同,但会为德语区域设置切换排序和分隔符,这会使其等同于raw_input

答案 2 :(得分:0)

这个问题存在的问题多于年度是否跳跃。 @ Dex&#t; ter解决方案确实会告诉你年份是否跳跃,但事情是你最终无法提出要求。所以你的第一个问题应该是闰年的用户输入日期:

 if calendar.isleap(date_year):

,然后是您的代码正常运行的月份。而且比你今天还有另一个问题。

 if 00 < int(date_day) < 32: 

这会给你带来错误的结果,无论年份是否跳跃,因为有足够的月份而不是31天。为此,我建议:

 >>> from calendar import monthrange
 >>> monthrange(2011, 2)

编辑:顺便说一下这个最后一个函数也支持闰年。

答案 3 :(得分:0)

我重写了你的程序。我希望它会有所帮助

import math
from datetime import datetime
repeat = True    
date = raw_input('Enter a date in the format MM/DD/YYYY :') 
while repeat:
    try:
        datetime.strptime(date, "%m/%d/%Y")
        date = raw_input('The date you entered is valid, enter another date in the format MM/DD/YYYY :')
    except ValueError:
        date = raw_input('invalid date found! Please enter another date in the format MM/DD/YYYY :')