Python Forum
Date format and past date check function
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Date format and past date check function
#1
I'm looking to combine my logic into a single function to check if the user's input is in my required format and to make sure the date is not in the past. Every time I think about it, it seems like I'm just a step away or there is a very simple solution but I've been stewing over this all day without any success.

Here's what I have so far:

from datetime import datetime

user_date = input("Provide date: ")

valid = False

while not valid:
    try:
        date = datetime.strptime(
            user_date, "%m/%d/%Y").strftime("%m/%d/%Y")
        valid = True
    except ValueError:
        user_date = input("Incorrect date format. Please try again: ")
I also have this snippet but am at a lose for how to incorporate it:

past = datetime.strptime(user_date, "%m/%d/%Y")
present = datetime.now()

if past.date() < present.date():
    return True
else:
    return False
I was thinking I could just put the past date check after the valid format check however if it fails the second check, I need to go back and make sure that their new input is in the valid format again.

As a bonus, I'm taking the time in a different input so if someone can help me take it as one input, that'd be great too.
Reply
#2
just compare them

from datetime import datetime

#make present date in to string(year/month/day):
present=datetime.now().strftime("%Y/%m/%d")

#split the date into presentlist as int:
presentlist=list(map(int,present.split('/')))
#print(presentlist)

#after the user input the date and checked by your code, it should be a string, so you split them again
userdate='2000/05/19'
userdatelist=list(map(int,userdate.split('/')))

#and you compare:
isPast=False
for num in range(len(presentlist)):
    if userdatelist[num]<presentdatelist[num]:
        isPast=True
        break
    else:
        continue
print(isPast)
Reply
#3
from datetime import datetime

def enter_date():
    '''Enter date string.  Return reformatted datestring and flag indicating if date is in the past'''
    while True:
        date = input('Provide date: ')
        try:
            date = datetime.strptime(date, '%m/%d/%Y')
        except ValueError as msg:
            print(msg)
        else:
            return date.strftime('%m/%d/%Y'), date < datetime.now()

print(enter_date())
Turtle likes this post
Reply
#4
import datetime


class DateFormatError(Exception):
    pass


class PastDateError(Exception):
    pass


def validate_date(date: str) -> datetime.datetime:
    try:
        date_time = datetime.datetime.strptime(date, "%m/%d/%Y %H:%M:%S")
    except ValueError:
        raise DateFormatError
    if date_time.date() < datetime.date.today():
        raise PastDateError
    return date_time


def main():
    while True:
        user_date = input("Provide date: ")
        try:
            date_time = validate_date(user_date)
            break
        except DateFormatError:
            print("Incorrect date format. Please try again")
        except PastDateError:
            print("Dates in the past are not allowed. Please try again")

    print(f"Correct date recieved {date_time}")


if __name__ == "__main__":
    main()
Turtle likes this post
Reply
#5
(Oct-21-2021, 10:41 PM)deanhystad Wrote:
from datetime import datetime

def enter_date():
    '''Enter date string.  Return reformatted datestring and flag indicating if date is in the past'''
    while True:
        date = input('Provide date: ')
        try:
            date = datetime.strptime(date, '%m/%d/%Y')
        except ValueError as msg:
            print(msg)
        else:
            return date.strftime('%m/%d/%Y'), date < datetime.now()

print(enter_date())

Thanks for this. It helped me achieve my goal but I did tweak it a bit. I added it so that if the date was in the past, it would not exit the while loop so that the user had to enter in a date that was either today or in the future.

from datetime import datetime


def enter_date():
    '''Enter date string.  Return reformatted datestring and flag indicating if date is in the past'''
    while True:
        date = input('Provide date: ')
        try:
            date = datetime.strptime(date, '%m/%d/%Y')
        except ValueError:
            print("Incorrect date format, please enter a proper date.")
        else:
            present = datetime.now()
            if date.date() >= present.date():
                return date.strftime('%m/%d/%Y')
            else:
                print("Date must not be in the past.")


print(enter_date())
Output:
Provide date: 912 Incorrect date format, please enter a proper date. Provide date: 101010 Incorrect date format, please enter a proper date. Provide date: 10/20/2021 Date must not be in the past. Provide date: 1021 Incorrect date format, please enter a proper date. Provide date: 10/21/2021 10/21/2021
Reply
#6
You can shorten it up a bit more. There's no need for the "present" variable of the final "else". It is also a good idea to provide guidance on what is the proper date format.
from datetime import datetime

def enter_date(prompt, valid):
    '''Enter date string.  Return reformatted datestring and flag indicating if date is in the past'''
    while True:
        date = input('Provide date (m/d/yyyy): ')
        try:
            date = datetime.strptime(date, '%m/%d/%Y')
        except ValueError:
            print("Incorrect date format, please enter a proper date.")
        else:
            if date.date() >= datetime.now().date():
                return date.strftime('%m/%d/%Y')
            print("Date must not be in the past.")
 
 
print(enter_date())
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Compare current date on calendar with date format file name Fioravanti 1 246 Mar-26-2024, 08:23 AM
Last Post: Pedroski55
  Date Time Series Help...Please spra8560 2 374 Feb-01-2024, 01:38 PM
Last Post: spra8560
  Create dual folder on different path/drive based on the date agmoraojr 2 455 Jan-21-2024, 10:02 AM
Last Post: snippsat
  Python date format changes to date & time 1418 4 618 Jan-20-2024, 04:45 AM
Last Post: 1418
  Why can't I copy and past only ONE specific tab? NewWorldRonin 8 816 Jan-12-2024, 06:31 PM
Last Post: deanhystad
  Downloading time zone aware files, getting wrong files(by date))s tester_V 9 1,055 Jul-23-2023, 08:32 AM
Last Post: deanhystad
  Formatting a date time string read from a csv file DosAtPython 5 1,297 Jun-19-2023, 02:12 PM
Last Post: DosAtPython
  PDF properties doesn't show created or modified date Pedroski55 4 1,099 Jun-19-2023, 08:09 AM
Last Post: Pedroski55
  How should I run pip-date in python3? newbieAuggie2019 5 1,893 Mar-31-2023, 03:21 PM
Last Post: snippsat
  How to see the date of installation of python modules. newbieAuggie2019 4 1,635 Mar-31-2023, 12:40 PM
Last Post: newbieAuggie2019

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020