例如,给定日期为“2016-12-31”,n为2,则期望输出为“2016-12-29”。
我调查了
我调查了
date
命令,并从当前日期获取n天前很容易:date -d“2 days ago”+%Y-%m-%d
请提供您想要提取两天的日期:
$ 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
date -jf %s $(( $(date +%s) - 86400 * 2 ))
# 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
# 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
_epoch2datefmt $(( $(_date2epoch 2016-12-31 %Y-%m-%d) - 2 * 86400 )) +%Y-%m-%d
# 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
%s
),因为GNU的date -d
需要一个前导符号@
。如果必要,这将保存该前缀在$A
中,清除格式(GNU很聪明,不需要它),然后将其余部分传递给GNU date
命令。BSD版本应该是不言自明的。”_date_helper %s $(( $(_date_helper %Y-%m-%d 2016-12-31 +%s) - 86400 * 2)) +%Y-%m-%d
-d
行为是GNU扩展,在POSIX、BSD等中找不到。 - pilcrow