È possibile estrarre i valori di giorno, mese e anno dal valore della data di input MM-GG-AAAA e convalidarlo invece come formato non ambiguo (ISO) AAAA-MM-GG (è possibile convalidare una data formattata GG-MM-AAAA come "corretto" utilizzando la data, ad esempio 25-12-2010, ma non è una data MM-GG-AAAA valida, da qui la necessità di modificare prima il formato della data)
Una data valida nel formato corretto va bene
30 novembre 2005 è valido:
$ 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 data non valida nel formato corretto NON va bene
31 novembre 2005 non convalida:
$ 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 data valida nel formato errato NON va bene
Il 20 aprile 1979 nel formato GG-MM-AAAA non è valido come data MM-GG-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
Metodo alternativo più semplice:usa la stringa variabile BASH sostituisci i trattini con le barre
$ 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
Puoi controllare con date -d "datestring"
Quindi date -d "12/31/2012"
è valido, ma usando i trattini, ad es. date -d "12-31-2012"
, non è valido per date
.
Puoi anche usare parole:date -d 'yesterday'
o date -d '1 week ago'
sono entrambi validi.