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')
答案 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
对象的month
,day
和date
属性,如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 :')