$date1がシェルで$date2より前であるかどうかを確認するには?

$date1がシェルで$date2より前であるかどうかを確認するには?
date1=$1
date2=$2

$date1以前であるかどうかを確認するには$date2

両方の日付の形式はDD/MM/YYすべてです01/01/15

答え1

恥ずかしく言いたい場合は、いつでもUTC epoch 1970-01-01 00:00:00に基づいて日付を変換できます。

#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

答え2

並べ替える必要があるので、フィールドに分割して始めてください。 YYMMDDまたはYYYYMMDDは文字列全体を一度に表示するため、この種の比較操作にはるかに優れています。

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

その後、1999年以前の年を処理する必要がある場合は、2桁の年を4桁に変更します。そうでなければ、99は01より大きい。

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

その後、YYYYMMDDの順序で再クリーンアップします。

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

これで比較できます。

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

注:これはbash固有の答えであり、POSIXで指定されていないbash(およびksh)固有の機能によって異なり、一部の/bin/shシステムではデフォルトのシェルでは機能しない場合があります。


POSIXには別のアプローチが必要です。awk重い作業を安全に行うことができます。

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

関連情報