datetime: ¿cómo requerir días y meses de 2 dígitos?

He estado usando el módulo datetime para verificar algunas fechas y ver si están en los formatos mm / dd / aaaa o mm / dd / aa. El problema es que las directivas% d y% m no son lo suficientemente sensibles como para detectar cuándo el mes o el día son un solo dígito, lo cual es un requisito mío.

datetime.strptime('01/01/2001', '%m/%d/%Y') 

Funciona como yo quiero, pero

 datetime.strptime('1/1/2001', '%m/%d/%Y') 

también produce una fecha y hora válida, cuando realmente quiero que lance un ValueError, a menos que el mes y el día estén rellenados con 0. ¿Alguien sabe cómo establecer una precisión requerida para los formatos de fecha y hora? ¿Es esto posible o debería ir con expresiones regulares en su lugar?

La función de datetime que está utilizando no pretende validar la entrada, solo para convertir cadenas en objetos de datetime y datetime . Ambos ejemplos son entradas de cadena legítimas en lo que respecta a datetime .

Si desea imponer la entrada del usuario para que sea un formato específico, me gustaría ir con una expresión regular – vea este ejemplo de mi REPL:

 >>> import re >>> pattern = re.compile(r"^[0-9]{2}/[0-9]{2}/[0-9]{4}$") >>> def valid_datestring(datestring): ... if pattern.match(datestring): ... return True ... return False ... >>> valid_datestring('1/1/2001') False >>> valid_datestring('01/01/2001') True 

Si desea definir una función que devuelva una fecha con formato o devuelva un valueError, puede hacer algo como esto:

 def format_datestring(datestring): if not valid_datestring(datestring): raise ValueError('Date input must be in the form dd/mm/yyyy!') return datetime.strptime(datestring, '%m/%d/%Y')