代码之家  ›  专栏  ›  技术社区  ›  cheng

n天前,从命令行上的给定日期开始

  •  8
  • cheng  · 技术社区  · 9 年前

    例如,给定日期为“2016-12-31”,n为2,预期输出为“2016年12月29日”。

    我调查 date 命令并从当前日期获取n天前的数据很容易:
    date -d "2 days ago" +%Y-%m-%d

    2 回复  |  直到 9 年前
        1
  •  14
  •   fedorqui    9 年前

    只需提及您要从中提取两天的日期:

    $ date -d "2016-12-31 2 days ago" +%Y-%m-%d
    2016-12-29
    

    或者在语法上更好一点:

    $ date -d "2016-12-31 -2 days" +%Y-%m-%d
    2016-12-29
    
        2
  •  2
  •   Adam Katz Huang    7 年前

    如果您没有GNU日期,可能您有 BSD date 相反在这种情况下,您可以执行以下操作:

    date -jf %s $(( $(date +%s) - 86400 * 2 ))
    

    注意,这不是POSIX,也不是GNU。

    这告诉BSD date不要更改时钟( -j )并将输入作为 UNIX time (UTC 1970/01/01 00:00:00后的秒数, -f %s ). 提供的时间是当前时间的数学替换( $(date +%s) ,使用相同的格式但作为输出)减去一天中的秒数(86400)乘以2。

    在过去,我编写了查找GNU然后故障转移到BSD的代码:

    # Usage: _epoch2datefmt UNIX_TIME [+FORMAT]
    if date -d @1484850180 +%s >/dev/null 2>&1
      then _epoch2datefmt() { date -d @"$@"; }    # GNU
      else _epoch2datefmt() { date -jf %s "$@"; } # BSD
    fi
    

    对于这个问题,我们还需要走另一个方向。BSD日期也需要格式:

    # Usage: _date2epoch YYYY-MM-DD [INPUT_FORMAT]
    if date -d 2017-01-19 +%s >/dev/null 2>&1
      then _yyyymmdd2epoch() { date -d "$1" +%s; }       # GNU
      else _yyyymmdd2epoch() { date -jf "$2" "$1" +%s; } # BSD
    fi
    

    下面是如何在GNU或BSD的指定日期前两天将这些数据组合在一起:

    _epoch2datefmt $(( $(_date2epoch 2016-12-31 %Y-%m-%d) - 2 * 86400 )) +%Y-%m-%d
    

    从内到外,它将2016-12-31转换为UNIX时间,减去两天(一天中有86400秒),然后传递得到的UNIX时间(答案)以转换回YYYY-MM-DD格式。


    如果您希望这一切都在一个功能中,它可以是:

    # Usage: _date_helper INPUT_FORMAT DATE [+OUTPUT_FORMAT]
    if date -d@1484850180 +%s >/dev/null 2>&1
      then _date_helper() { local A=; [ "$1" = %s ] && A=@; shift; date -d "$A$@"; }
      else _date_helper() { date -jf "$@"; }
    fi
    

    (我在处理输入UNIX时间时需要有点技巧(如第一个参数所示: %s )自从GNU date -d 需要领导 @ .这会将该前缀保存在 $A 如有必要,清除格式(GNU是智能的,否则不需要),然后将其余内容传递给GNU date 命令BSD版本应该是自解释的。)

    下面是如何使用此函数运行它以获取“2016-12-31前两天”:

    _date_helper %s $(( $(_date_helper %Y-%m-%d 2016-12-31 +%s) - 86400 * 2)) +%Y-%m-%d
    
    推荐文章