Saltar al contenido

comprobar si el argumento es una fecha válida en bash shell

Deseamos brindarte la mejor información que hallamos on line. Nosotros esperamos que te resulte útil y si quieres aportar algo que nos pueda ayudar a mejorar hazlo con total libertad.

Solución:

Puedes consultar con date -d "datestring"

Asi que date -d "12/31/2012" es válido, pero usando guiones, por ejemplo date -d "12-31-2012"no es válido para date.

También puedes usar palabras: date -d 'yesterday' o date -d '1 week ago' ambos son válidos.

Puede extraer los valores de día, mes y año del valor de fecha de entrada MM-DD-AAAA y validarlo como el formato inequívoco (ISO) AAAA-MM-DD en su lugar (puede validar una fecha con formato DD-MM-AAAA como “correcto” utilizando la fecha, por ejemplo, 25-12-2010, pero no es una fecha MM-DD-AAAA válida, de ahí la necesidad de cambiar el formato de fecha primero)


Una fecha válida en el formato correcto está bien

30 de noviembre de 2005 es válido:

$ DATE=11-30-2005; d=$DATE:3:2; m=$DATE:0:2; Y=$DATE:6:4; echo "year=$Y, month=$m, day=$d"; if date -d "$Y-$m-$d" &> /dev/null; then echo VALID; else echo INVALID; fi
year=2005, month=11, day=30  
VALID

$ DATE=11-30-2005; if date -d "$DATE:6:4-$DATE:0:2-$DATE:3:2" &> /dev/null; then echo VALID; else echo INVALID; fi
VALID

Una fecha inválida en el formato correcto NO ESTÁ BIEN

31 de noviembre de 2005 no valida:

$ DATE=11-31-2005; d=$DATE:3:2; m=$DATE:0:2; Y=$DATE:6:4; echo "year=$Y, month=$m, day=$d"; if date -d "$Y-$m-$d" &> /dev/null; then echo VALID; else echo INVALID; fi
year=2005, month=11, day=31  
INVALID

$ DATE=11-31-2005; if date -d "$DATE:6:4-$DATE:0:2-$DATE:3:2" &> /dev/null; then echo VALID; else echo INVALID; fi
INVALID

Una fecha válida en el formato incorrecto NO ESTÁ BIEN

20 de abril de 1979 en formato DD-MM-AAAA no valida como fecha MM-DD-AAAA:

$ DATE=20-04-1979; d=$DATE:3:2; m=$DATE:0:2; Y=$DATE:6:4; echo "year=$Y, month=$m, day=$d"; if date -d "$Y-$m-$d" &> /dev/null; then echo VALID; else echo INVALID; fi
year=1979, month=20, day=04  
INVALID

$ DATE=20-04-1979; if date -d "$DATE:6:4-$DATE:0:2-$DATE:3:2" &> /dev/null; then echo VALID; else echo INVALID; fi
INVALID

Método alternativo más simple: use la variable BASH string reemplazar guiones por barras

$ DATE="04-30-2005"; [[ $(date -d "$DATE//-//" 2> /dev/null) ]] && echo VALID || echo INVALID
VALID

$ DATE="04-31-2005"; [[ $(date -d "$DATE//-//" 2> /dev/null) ]] && echo VALID || echo INVALID
INVALID

Para el uso del script, lo mantuve tan simple como pude. Probar el valor de la fecha con la función de fecha y luego verificar el código de salida del proceso.

date -d "02/01/2000" 2>: 1>:; echo $?

Esto redirigirá la entrada estándar y el error estándar a null : y usando echo para devolver el código de salida con $? me permite verificar 0 = buena fecha y 1 = mala fecha.

Reseñas y valoraciones

Puedes añadir valor a nuestro contenido informacional contribuyendo tu veteranía en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *