web-dev-qa-db-ja.com

Pythonでは、日付が有効かどうかを確認する方法は?

一種のカレンダー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ステートメントを書くことができますが、これをチェックできる組み込み関数はありますか?

ありがとう

21
Synia

やってみてください

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()

関連する健全性の上限と下限は、ニーズによって異なります。

編集:これはあなたのアプリケーションには有効ではないかもしれない特定の日時のもの(最小誕生日、休日、営業時間外など)を処理しないことに注意してください

22

日時を使用して、例外を処理して有効/無効の日付を決定することができます。例: http://codepad.org/XRSYeIJJ

import datetime
correctDate = None
try:
    newDate = datetime.datetime(2008,11,42)
    correctDate = True
except ValueError:
    correctDate = False
print(str(correctDate))
23
DhruvPathak

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
4
jamylak

この質問では、ライブラリのないソリューションには「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])
1
anon

日時を使用して、例外を処理して有効/無効の日付を決定できます。

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による回答 の改善であり、編集としてより意味がありますが、「 この編集は投稿の著者に対処するためのものであり、編集としては意味がありません。コメントまたは回答として記述されている必要があります。 "

1

これは時間を使用した解決策です。

インポート時間
 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 
1
David P
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>")
0