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" usando la fecha, por ejemplo, 25-12-2010, pero no es una fecha MM-DD-AAAA válida, por lo tanto, primero es necesario cambiar el formato de fecha)
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 cadena variable BASH, reemplace los 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
Puedes consultar con date -d "datestring"
Así que date -d "12/31/2012"
es válido, pero usando guiones, p. 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.