一種のカレンダーWebアプリを構築しています
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>
ユーザーからの入力は、cherrypyサーバーに送信されます
ユーザーが入力した日付が有効な日付であるかどうかを確認する方法はありますか?
明らかに、たくさんのifステートメントを書くことができますが、これをチェックできる組み込み関数はありますか?
ありがとう
やってみてください
import datetime
datetime.datetime(year=year,month=month,day=day,hour=hour)
12を超える月、23を超える月、存在しないうるう日(うるう年ではない月= 2が最大28、それ以外の場合は30または31日である他の月)のようなものを削除します(エラー時にValueError例外をスローします)
また、いくつかの健全性の上限/下限と比較することもできます。例:
datetime.date(year=2000, month=1,day=1) < datetime.datetime(year=year,month=month,day=day,hour=hour) <= datetime.datetime.now()
関連する健全性の上限と下限は、ニーズによって異なります。
編集:これはあなたのアプリケーションには有効ではないかもしれない特定の日時のもの(最小誕生日、休日、営業時間外など)を処理しないことに注意してください
日時を使用して、例外を処理して有効/無効の日付を決定することができます。例: http://codepad.org/XRSYeIJJ
import datetime
correctDate = None
try:
newDate = datetime.datetime(2008,11,42)
correctDate = True
except ValueError:
correctDate = False
print(str(correctDate))
datetime
を使用
例えば。
>>> 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
この質問では、ライブラリのないソリューションには「if文が大量に含まれている」と想定していますが、そうではありません。
def is_valid_date(year, month, day):
day_count_for_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if year%4==0 and (year%100 != 0 or year%400==0):
day_count_for_month[2] = 29
return (1 <= month <= 12 and 1 <= day <= day_count_for_month[month])
日時を使用して、例外を処理して有効/無効の日付を決定できます。
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)))
False
True
False
True
False
これは DhruvPathakによる回答 の改善であり、編集としてより意味がありますが、「 この編集は投稿の著者に対処するためのものであり、編集としては意味がありません。コメントまたは回答として記述されている必要があります。 "
これは時間を使用した解決策です。
インポート時間 def is_date_valid(year、month、day): this_date = '%d /%d /%d'%(month、day、year) try: time.strptime(this_date、 '%m /%d /%Y') 例外ValueError: return False else: return True
y = int(input("Year: "))
m = int(input("Month: "))
d = int(input("Day: "))
if 0 <= y and 0 < m < 13 and 0 < d < 32: #Check whether date is under limit.
if y % 4 == 0: # Every 4 year "Leap" year occures so checking...
if m == 2: # In "Leap" year February has 29 days
if d < 30:
print("<Correct>")
else:
print("<Wrong>")
Elif m == 2: # But if it's not "Leap" year February will have 28 days
if d < 29:
print("<Correct>")
else:
print("<Wrong>")
Elif y % 4 != 0 and m != 2: # Otherwise print "Correct"
print("<Correct>")
else:
print("<Wrong>")