Como posso verificar se $ date1 está antes de $ date2 no shell?

3
date1=$1
date2=$2

Como posso verificar se $date1 é antes de $date2 ?

Ambas as datas estão no formato DD/MM/YY , por exemplo, 01/01/15 .

    
por Jack 16.10.2015 / 20:56

2 respostas

4

Primeiro, divida-o em campos, pois você precisará reorganizá-los. YYMMDD ou YYYYMMDD é muito melhor para este tipo de operação de comparação, uma vez que pode olhar para toda a cadeia de uma só vez.

IFS="/" date1a=($date1) date2a=($date2)

Então, se você precisa lidar com anos antes de 1999, conserte os anos de dois dígitos com quatro dígitos, caso contrário, 99 será maior que 01.

((date1a[2] += (date1a[2] < 70 ? 2000 : 1900)))
((date2a[2] += (date2a[2] < 70 ? 2000 : 1900)))

Em seguida, junte-os novamente na ordem YYYYMMDD:

date1b="${date1a[2]}${date1a[1]}${date1a[0]}"
date2b="${date2a[2]}${date2a[1]}${date2a[0]}"

E agora você pode compará-los:

if (( $date1b < $date2b )); then
    echo "earlier"
else
    echo "later"
fi

Nota: Esta é uma resposta específica do bash, dependendo das características específicas do bash (e ksh) não especificadas no POSIX, e assim pode não funcionar com /bin/sh ou o shell padrão em alguns sistemas.

POSIX requer uma abordagem diferente; você pode confiar em awk para fazer um pouco do trabalho pesado:

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
    
por 16.10.2015 / 21:19
3

se você quisesse ser realmente atrevido, você poderia sempre converter as datas baseadas na época 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
    
por 16.10.2015 / 22:23

Tags