date1=$1 date2=$2
Comment puis-je vérifier si $date1
est avant $date2
?
Les deux dates sont en format DD/MM/YY
, soit 01/01/15
.
Divisez-le d'abord en champs, car vous devrez les réorganiser. AAMMJJ ou AAAAMMJJ est beaucoup mieux pour ce type d'opération de comparaison car il peut regarder l'set de la string à la fois.
IFS="/" date1a=($date1) date2a=($date2)
Ensuite, si vous avez besoin d'années avant 1999, fixez les années à deux numbers à quatre numbers, sinon 99 est supérieur à 01.
((date1a[2] += (date1a[2] < 70 ? 2000 : 1900))) ((date2a[2] += (date2a[2] < 70 ? 2000 : 1900)))
Puis remettez-les set dans l'ordre AAAAMMJJ:
date1b="${date1a[2]}${date1a[1]}${date1a[0]}" date2b="${date2a[2]}${date2a[1]}${date2a[0]}"
Et maintenant vous pouvez les comparer:
if (( $date1b < $date2b )); then echo "earlier" else echo "later" fi
Remarque: Il s'agit d'une réponse spécifique à bash, en fonction des fonctionnalités spécifiques à bash (et ksh) non spécifiées dans POSIX, et donc ne fonctionne pas avec /bin/sh
ou le shell par défaut sur certains systèmes.
POSIX nécessite une approche différente; vous pouvez countr sur awk
pour faire le gros du travail:
awkscr='BEGIN {FS="/"}; {print $3+($3<70?2000:1900) $2 $1}' date1b=$(echo "$date1" | awk "$awkscr") date2b=$(echo "$date2" | awk "$awkscr") if [ "$date1b" -lt "$date2b" ]; then echo "earlier" else echo "later" fi
si vous voulez être vraiment effronté, vous pouvez toujours convertir les dates basées sur l'époque 1970-01-01 00:00:00 UTC.
#added to fix DD/MM/YY format input1=`echo $1 | awk -F "/" '{print $2"/"$1"/"$3}'` input2=`echo $2 | awk -F "/" '{print $2"/"$1"/"$3}'` date1=`date +%s --date="$input1"` date2=`date +%s --date="$input2"` if [[ "$date1" -lt "$date2" ]]; then echo "$1 earlier than $2" else echo "$1 not earlier than $2" fi