date1=$1
date2=$2
如何检查$ date1是否在$ date2之前?
两个日期均为DD / MM / YY格式,即01/01/15。
答案 0 :(得分:1)
通常,您可以使用date
工具将两个日期从epoch转换为秒,然后比较两个数字。
使用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 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