比较MAC OSX中Bash中的两个日期

时间:2017-09-26 12:32:20

标签: bash macos date

我是Bash的新手,提前道歉。

设置向上

我的特定结束日期end取决于特定的开始日期s和期间长度pend=s+p

问题

当且仅当今天的日期早于或等于结束日期时,我才想执行命令。

即:执行命令iff date ≤ end

代码

s='20/09/2017'
p='1'
end=$( date -j -v +"$p"d -f "%d/%m/%Y" "$s")

if [[ date < “$end” ]];
then
   echo 'ok'
fi

有两件事不应该是,

  1. p=1暗示end = '21/09/2017'&lt; date = '26/09/2017',但我仍然得到ok
  2. 我使用date < “$end”,但我想要date ≤ “$end”
  3. 如何纠正1和2?

3 个答案:

答案 0 :(得分:3)

格式化YYYYMMDD之类的日期时,您只需使用字母数字比较:

start=$(date +'%Y%m%d')
end=$(date +'%Y%m%d')

# -gt means greater than - for example.
# check `help test` to get all available operators
if [ $start -gt $end ] ; then ...

答案 1 :(得分:2)

首先,你需要使用词典编纂的日期格式,这意味着大单位首先出现。我强烈推荐ISO标准YYYY-MM-DD或YYYYMMDD。其次,<=可以写成-le(小于或等于)。

答案 2 :(得分:1)

  1. 您:

    end=$( date -j -v+"$p"d -f "%d/%m/%Y" "$s" )
    

    没有产生你期望的东西:

    echo "$end"
    Thu Sep 21 14:40:54 CEST 2017
    

    您可以通过以下方式获得预期:

    end=$( date -j -v+"$p"d -f "%d/%m/%Y" "$s" +"%d/%m/%Y" )
    
  2. 您的比较:

    if [[ date < “$end” ]]; then
    

    表现不像你想象的那样。由于调用date命令,date未展开。因此,您的比较是字符串<和字符串[[.]]之间的字符串比较("date"条件表达式上下文中的"Thu Sep 21 14:40:54 CEST 2017")。你应该使用类似的东西:

    date=$( date )
    if [[ "$date" < “$end” ]]; then
    

    相反(但使用date作为变量名可能不是一个好主意。)

  3. 正如其他答案所注意到的那样,您选择的日期格式不是最佳比较。因此,将各种修复与其他明智的建议相结合,您可以尝试类似:

    s='20170920'
    p='1'
    end=$( date -j -v+"$p"d -f "%Y%m%d" "$s" +"%Y%m%d" )
    now=$( date +"%Y%m%d" )
    if (( now <= end )); then
       echo 'ok'
    fi
    

    注意:if (( now <= end )); then是算术比较,它应该适用于这种特定情况。另请注意,它使用nowend,而不是$now$end((.))算术比较将变量名称解释为存储在变量中的整数值。无论如何,使用日期,即使是YYYYmmdd格式,就好像它们是整数一样不是那么干净。使用UNIX时间戳(至少在year 2038之前应该没问题)可能更简洁:

    s='20170920'
    p='1'
    end=$( date -j -v+"$p"d -f "%Y%m%d" "$s" +"%s" )
    now=$( date +"%s" )
    if (( now <= end )); then
       echo 'ok'
    fi
    

    因为此处nowend是自the Epoch以来的秒数,即真正的整数。但请注意,结果可能与之前的解决方案不同,因为您现在有一秒精度而不是一天。选择哪一个符合您的需求。