如何在 shell 中检查 $date1 是否在 $date2 之前?

如何在 shell 中检查 $date1 是否在 $date2 之前?
date1=$1
date2=$2

如何检查是否$date1是之前$date2

两个日期的格式均为DD/MM/YYie 01/01/15

答案1

如果你想厚颜无耻,你可以随时根据 UTC 纪元 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年之前的年份,请将两位数年份固定为四位数,否则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某些系统上的默认 shell。


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

相关内容