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

时间:2015-10-16 19:06:36

标签: bash shell

date1=$1
date2=$2

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

两个日期均为DD / MM / YY格式,即01/01/15。

3 个答案:

答案 0 :(得分:1)

通常,您可以使用date工具将两个日期从epoch转换为秒,然后比较两个数字。

的Linux

使用GNU日期,看起来像:

# Linux, assumes MM/DD/YY dates so it won't work in your case. See below.
if (( $(date +%s -d "$date1") < $(date +%s -d "$date2") )); then
  # $date1 is earlier
else
  # $date1 is not earlier (could be the same as date2)
fi

但是,您需要确保date程序可以理解日期输入格式。遗憾的是,格式dd/dd/dd含糊不清:它可能是美式MM/DD/YY,也可能是传统的加拿大风格DD/MM/YY。实际上,GNU日期将 / 分隔符的日期解释为月份优先(MM/DD/YY)。带有 - 分隔符的日期被解释为年前(YY-MM-DD)。

在这种情况下,如果您的日期确实是DD/MM/YY,则需要重新排列日期格式才能使用date实用程序,或者只是自己比较这三个数字。 (后者的缺点是你需要解决所有可能的极端情况,包括YY引用其他世纪的可能性。)

# Linux, assumes DD/MM/YY dates.
IFS=/ read d1 m1 y1 <<<"$date1"
IFS=/ read d2 m2 y2 <<<"$date2"
if (( $(date +%s -d "$m1/$d1/$y1") < $(date +%s -d "$m2/$d2/$y2" )); then

注意:如果您确定$ y1和$ y2代表同一世纪的年份,并且月份和日期都是两位数字,您可以直接进行比较 - if (($y1$m1$d1 < $y2$m2$d2)); then - 但这是非常不受推荐的,因为它非常脆弱。可以进行各种修复,但使用date是最简单的。

BSD / Mac OS X

使用BSD date实用程序(在OS X上也可以使用),这一切都更容易,因为该实用程序允许您指定显式strptime格式,在您的情况下%d/%m/%y

# BSD/Mac, assumes DD/MM/YY dates. Adjust `-f` format as appropriate.
if (( $(date -f '%d/%m/%y' "$date1" +%s) < $(date -f '%d/%m/%y' "$date2" +%s) )); then

答案 1 :(得分:0)

我认为这会起作用

newDate1=$(awk -F '/' '{print $2"/"$1"/"$3}' <<< $date1)
newDate2=$(awk -F '/' '{print $2"/"$1"/"$3}' <<< $date2)
date1s=$(date --date=$newDate1 +%s)
date2s=$(date --date=$newDate2 +%s)

if [[ $date1s -gt $date2s ]];then
    ..date stuff
fi

这假设date1和date2在1970之后,并且您的日期确实是DD / MM / YY格式可靠。我刚刚在BSD中对此进行了测试,但它不起作用,所以这个答案只对Gnu / Linux有用。

编辑:固定为DD / MM / YY转换为MM / DD / YY

答案 2 :(得分:0)

首先得到日,月和年:

day1=`echo $date1 | sed -e 's:/.*::'`
year1=`echo $date1 | sed -e 's:.*/::'`
month1=`echo $date1 | sed -e 's:[^/]*/::' | sed -e 's:/.*::'`

您可以对其他日期执行相同的操作。然后:

if [ $year1 -lt $year2 -o \( $year1 -eq $year2 -a $month1 -lt $month2 \) -o \( $year1 -eq $year2 -a $month1 -eq $month2 -a $day1 -lt $day2 \) ]; then
    echo "date1 lt date2"
fi