Home > front end >  How to limit the input in Python for only dates?
How to limit the input in Python for only dates?

Time:11-10

Im currently working on my project. I want the user to only be allowed to input a date (ex, January 2). If he enters anything else than a date a message should appear like "This is not a date, try again" repeatedly until a real date is given. How do i do this?

My initial idea was to create a .txt file were i write all the 365 dates and then somehow code that the user is only allowed to enter a string that matches one of the elements in the file, else try again.

I would really apreciate your help

CodePudding user response:

Use dateutil.parser to handle dates of arbitrary formats.

Code

import dateutil.parser

def valid_date(date_string):
    try:
        date = dateutil.parser.parse(date_string)
        return True
    except ValueError:
        return False
    

Test

for  date in ['Somestring', 'Feb 20, 2021', 'Feb 20', 'Feb 30, 2021', 'January 25, 2011', '1/15/2020']:
    print(f'Valid date {date}: {valid_date(date)}')

Output

Valid date Somestring: False         # detects non-date strings
Valid date Feb 20, 2021: True
Valid date Feb 20: True
Valid date Feb 30, 2021: False       # Recognizes Feb 30 as invalid
Valid date January 25, 2011: True
Valid date 1/15/2020: True           # Handles different formats

CodePudding user response:

There is no need to store all possible valid dates in a file. Use datetime.strptime() to parse a string (entered by the user) into a datetime object according to a specific format. strptime will raise an exception the input specified does not adhere to the pattern, so you can catch that exception and tell the user to try again. Wrap it all in a while loop to make it work forever, until the user gets it right.

You can start with this:

from datetime import datetime

pattern = '%B %d, %Y' # e.g. January 2, 2021
inp = ''
date = None
while date is None:
    inp = input('Please enter a date: ')
    try:
        date = datetime.strptime(inp, pattern)
        break
    except ValueError:
        print(f'"{inp}" is not a valid date.')
        continue

For a full list of the %-codes that strptime supports, check out the Python docs.

CodePudding user response:

Provide you with several ways to verify the date, these are just simple implementations, and there is no strict check, you can choose one of the methods and then supplement the detailed check by yourself.


Use date(year,month,day)

def isValidDate(year, month, day):
    try:
        date(year, month, day)
    except:
        return False
    else:
        return True

Use date.fromisoformat()

def isValidDate(datestr):
    try:
        date.fromisoformat(datestr)
    except:
        return False
    else:
        return True

Use strptime

def check_date(i):
    valids = ['%Y-%m-%d', '%Y%M']
    for valid in valids
        try:
            return strptime(i, valid)
        except ValueError as e:
            pass
    return False

Use regex

def check_date(str):
    reg = /^(\d{4})-(\d{2})-(\d{2})$/;
    return reg.test(str)
  • Related