2012-04-03 32 views
15

Estoy construyendo un tipo de aplicación web calandraEn python, ¿cómo verificar si una fecha es válida?

He creado el siguiente formulario en 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> 

La entrada del usuario se submited continuación, en el servidor de un cherrypy

soy preguntándose, ¿hay alguna manera de verificar si la fecha ingresada por el usuario es una fecha válida?

Obviamente, podría escribir un montón de declaraciones if, pero ¿hay alguna función incorporada que pueda verificar esto?

Gracias

+0

Relacionado: [¿Cómo valido un formato de cadena de fecha en python?] (Http://stackoverflow.com/q/16870663) – kenorb

Respuesta

18

usted podría intentar hacer

import datetime 
datetime.datetime(year=year,month=month,day=day,hour=hour) 

que eliminará tantos como meses> 12, horas> 23, leapdays inexistentes (mes = 2 tiene un máximo de 28 en años no bisiestos, 29 de otro modo , otros meses tienen un máximo de 30 o 31 días) (arroja la excepción ValueError por error)

También podría intentar compararlo con algunos límites de cordura superior/inferior. ej .:

datetime.date(year=2000, month=1,day=1) < datetime.datetime(year=year,month=month,day=day,hour=hour) <= datetime.datetime.now() 

Los límites superior e inferior de sanidad pertinentes dependerá de sus necesidades.

edición: recuerde que esto no maneja ciertas datetimes cosas que pueden no ser válidos para su aplicación

3

Uso datetime

por ejemplo.

>>> 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 
+0

¿Pero no me daría un mensaje de error? y hacer que todo se estrelle? Esperaba que si hubiera una función que para el examen, devuelva 1 si es una fecha válida, y devuelve 0 si no es válida. Luego, puedo pedirle al usuario que vuelva a ingresar la fecha en la página web. – Synia

+1

O puede 'intentar ... excepto' y detectar el error. Entonces puede hacer lo que quiera, pase el error en silencio si así lo desea. – jamylak

+1

ver http://docs.python.org/tutorial/errors.html#handling-exceptions –

21

puede intentar utilizar de fecha y hora y manejar las excepciones (min cumpleaños, días de fiesta, en las horas de operación, ect.) para decidir la fecha válida/no válida: Ejemplo: http://codepad.org/XRSYeIJJ

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

tanto, aquí está mi solución hacky para corregir las fechas previstas no válidos. Esto supone que el usuario está enviando desde un formulario html genérico que proporciona los días 1 a 31 como opciones. El problema principal es que los usuarios proporcionen un día que no existe para el mes (ex 31 de septiembre)

def sane_date(year, month, day): 
    # Calculate the last date of the given month 
    nextmonth = datetime.date(year, month, 1) + datetime.timedelta(days=35) 
    lastday = nextmonth.replace(day=1) - datetime.timedelta(days=1) 
    return datetime.date(year, month, min(day, lastday.day)) 

class tests(unittest.TestCase): 

    def test_sane_date(self): 
     """ Test our sane_date() method""" 
     self.assertEquals(sane_date(2000,9,31), datetime.date(2000,9,30)) 
     self.assertEquals(sane_date(2000,2,31), datetime.date(2000,2,29)) 
     self.assertEquals(sane_date(2000,1,15), datetime.date(2000,1,15)) 
1

Aquí hay una solución que utiliza el tiempo.

import time 
def is_date_valid(year, month, day): 
    this_date = '%d/%d/%d' % (month, day, year) 
    try: 
     time.strptime(this_date, '%m/%d/%Y') 
    except ValueError: 
     return False 
    else: 
     return True 
+1

¿por qué lo harías en lugar de simplemente 'date (year, month, day)'? – jfs

1

Puedes probar a utilizar de fecha y hora y manejar las excepciones para decidir fecha válida/no válida:

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

gives

False 
True 
False 
True 
False 

Ésta es la mejora de an answer by DhruvPathak y tiene más sentido como una edición, pero se rechazó como "This edit was intended to address the author of the post and makes no sense as an edit. It should have been written as a comment or an answer."

Cuestiones relacionadas