2014-11-01 8 views
-2
from datetime import date 
future = input("Enter a date(dd/mm/yyyy): ") 
daystring = future[0:2] 
monthstring = future[3:5] 
yearstring = future[6:10] 

today = (date.today()) 
month = date.today().month 
year = date.today().year 
day = date.today().day 

if monthstring == "01" or "03" or "05" or "07" or "08" or "10" or "12": 
    if daystring > "31": 
     print("Invalid Date Entered") 
if monthstring == "04" or "06" or "09" or "11": 
    if daystring > "30": 
     print("Invalid Date Entered") 
months = ["Jan", "Feb", "Mar", "Apr", "May", "June", 
      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 
daysinmonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 
       31, 30, 31] 


if future < today or monthstring > "12": 
    print("Invalid Date Entered") 

else: 
    layout = "%d/%m/%Y" 
    a = datetime.strptime(future, layout) 
    b = datetime.strptime(today, layout) 
    delta = a - b 
    print ("The difference between the inputted date and todays date is: ",delta.days, "days") 

Этот код должен попросить пользователя ввести дату в будущем, а затем код должен использовать этот ввод и вычесть из него текущую дату.разница между двумя датами python

Например, сегодня 01/11/2014, и если пользователь вводит 03/11/2014, выход должен состоять в том, что разница составляет 2 дня.

Однако, я получаю сообщение об ошибке каждый раз, когда я ввожу будущую дату.

+1

* "Я получаю ошибку при вводе данных каждый раз, когда я на будущую дату" * - ** какая ошибка ** Если это Python 2.x, вы должны использовать 'raw_input'. Почему вы «импортируете» из 'datetime', затем вручную нарезаете« будущее »и пытаетесь самостоятельно разобрать? Просто * используйте 'strptime' *. – jonrsharpe

+1

Вы сравниваете строки; Знаете ли вы, что «9»> «31» - это правда, когда вы это делаете? –

+0

Я использую python 3 – user3396351

ответ

-1

Есть разные вещи, которые следует учитывать. Попытайтесь принять во внимание эти пункты

  • Проверьте, входит ли пользователь в правильное время и дату. Для этого вы можете использовать регулярное выражение. Вы можете использовать модуль RE.
mat=re.match('(\d{2})[/](\d{2})[/](\d{4})$', str(future)) 
  • Вы должны фильтровать значения между 1-12 в течение нескольких месяцев, и между 1-31 в течение нескольких дней. Затем различайте месяцы и не забывайте February в обоих случаях (високосный год или нет). Вы можете использовать модуль calender, чтобы проверить это.
t= calendar.monthrange(int(yearstring), 2) # This is to check if February has 29 or 28 (is leap year or no), you can do that by checking the day number of "datetime.date (int(yearstring), 3, 1) - datetime.timedelta (days = 1)" 
  • Затем сравните между двумя датами, вы должны использовать правильный формат времени для каждой даты.
a = date.datetime.strptime(future, "%d/%m/%Y").date() 
b = date.datetime.strptime(today, "%Y-%m-%d").date() 
delta = a-b 

Ваш код будет выглядеть так:?!

import datetime as date 
import re 
import calendar 

future = input("Enter a date(dd/mm/yyyy): ") 
#eg: future="02/03/2015" 
#print future 

mat=re.match('(\d{2})[/](\d{2})[/](\d{4})$', str(future)) 
if mat is None: 
    print("Invalid Date Entered, try to enter a date in this form(dd/mm/yyyy) ") 
else: 
    daystring,monthstring,yearstring= mat.groups() 

    today= str(date.datetime.now()).split(" ")[0] 
    year, month, day = today.split("-") 

    months = ["Jan", "Feb", "Mar", "Apr", "May", "June","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 
    daysinmonth = [31, 29, 31, 30, 31, 30, 31, 31, 30,31, 30, 31] 

    if int(daystring)>0 and int(daystring)<=31 and int(monthstring)>0 and int(monthstring) <= 12 and int(yearstring)>0: 
     if monthstring in ["01", "03", "05" ,"07","08","10", "12"]: 
      if int(daystring) > 31: 
       print("Invalid Date Entered - Number of days can't exceed 31.") 
     if monthstring in ["04","06","09","11"]: 
      if int(daystring) > 30: 
       print("Invalid Date Entered - Number of days can't exceed 31.") 
     if monthstring == "02": 
      t= calendar.monthrange(int(yearstring), 2) # This is to check if February has 29 or 28 (is leap year or no), you can do that by checking the day number of "datetime.date (int(yearstring), 3, 1) - datetime.timedelta (days = 1)" 
      if int(daystring) !=t: #You forget faberuary 
       print("Invalid Date Entered - of days can't exceed 28 or 29") 


     a = date.datetime.strptime(future, "%d/%m/%Y").date() 
     b = date.datetime.strptime(today, "%Y-%m-%d").date() 
     delta = a-b # The future - Today ::> to get a positive number 
     if delta.days >0: 
      print ("The difference between the inputted date and todays date is: ",delta.days, "days") 
     else: 
      print("Date is in the past") 

    else: 
     print("Invalid Date Entered") 
+0

Большое спасибо за помощь. – user3396351

+0

. ** Для этого абсолютно нет необходимости **. Зачем вам все это вручную проверять дату? Просто охраняйте вызов 'strptime' с помощью' try', и пусть библиотека выполняет эту работу. – jonrsharpe

0
import dateutil.parser as parser 
import datetime 
date1 = parser.parse(input("Enter Date:")) 
print((datetime.datetime.now() - date1).days) 

dateutil очень хорошо разборе естественной даты строки ...

вам, возможно, потребуется установить dateutil

easy_install python-dateutil 

, если вы хотите, чтобы не использовать dateutil как уже упоминалось вы можете использовать strptime

def get_user_date(prompt="Enter Date:"): 
    while True: 
     try: 
      return datetime.datetime.strptime("%m/%d/%y",input(prompt)) 
     except ValueError: 
      print("Invalid Input!") 

этот код, я думаю, что будет работать в Python 3

Смежные вопросы