如何在 shell 中比较两个日期?

如何在 shell 中比较两个日期?

如何在 shell 中比较两个日期?

这是我想如何使用它的示例,尽管它不能按原样工作:

todate=2013-07-18
cond=2013-07-15

if [ $todate -ge $cond ];
then
    break
fi                           

我怎样才能达到预期的结果?

答案1

正确答案仍然缺失:

todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)

if [ $todate -ge $cond ];
then
    break
fi  

请注意,这需要 GNU 日期。dateBSD 的等效语法date(默认情况下在 OSX 中找到)是date -j -f "%F" 2014-08-19 +"%s"

答案2

可以使用 ksh 样式的字符串比较来比较 [年、月、日格式的字符串] 的时间顺序。

date_a=2013-07-18
date_b=2013-07-15

if [[ "$date_a" > "$date_b" ]] ;
then
    echo "break"
fi

值得庆幸的是,当[使用 YYYY-MM-DD 格式的字符串]按字母顺序排序*时,它们也按时间顺序排序*。

(* - 排序或比较)

在这种情况下不需要任何花哨的东西。耶!

答案3

您缺少比较的日期格式:

#!/bin/bash

todate=$(date -d 2013-07-18 +"%Y%m%d")  # = 20130718
cond=$(date -d 2013-07-15 +"%Y%m%d")    # = 20130715

if [ $todate -ge $cond ]; #put the loop where you need it
then
 echo 'yes';
fi

您也缺少循环结构,您打算如何获得更多日期?

答案4

该运算符-ge仅适用于整数,而您的日期则不适用于整数。

如果您的脚本是 bash、ksh 或 zsh 脚本,则可以改用该<运算符。该运算符在 dash 或其他不超出 POSIX 标准的 shell 中不可用。

if [[ $cond < $todate ]]; then break; fi

在任何 shell 中,您只需删除破折号即可将字符串转换为数字,同时尊重日期顺序。

if [ "$(echo "$todate" | tr -d -)" -ge "$(echo "$cond" | tr -d -)" ]; then break; fi

或者,您可以采用传统方式并使用该expr实用程序。

if expr "$todate" ">=" "$cond" > /dev/null; then break; fi

由于在循环中调用子进程可能会很慢,因此您可能更喜欢使用 shell 字符串处理结构进行转换。

todate_num=${todate%%-*}${todate#*-}; todate_num=${todate_num%%-*}${todate_num#*-}
cond_num=${cond%%-*}${cond#*-}; cond_num=${cond_num%%-*}${cond_num#*-}
if [ "$todate_num" -ge "$cond_num" ]; then break; fi

当然,如果您首先可以检索不带连字符的日期,您将能够将它们与-ge.

相关内容