date
我想在command内部使用变量。我的系统不支持 GNU 日期。我使用 Sunos,当我使用date
with-d
选项时,它显示-d
为错误的替代。
#!/usr/bin/ksh
RELEASE_DATE="28 OCT 2018"
RELEASE_DATE_MINUS_2=`date -"${RELEASE_DATE: -2} ${RELEASE_DATE:4:3} ${RELEASE_DATE:0:4} - 2 days" '+%Y-%m-%d'`
echo "Release is $RELEASE_DATE"
echo "release_date-2 is $RELEASE_DATE_MINUS_2
我已经尝试过上面的代码片段。我应该传递我从另一个文件release_date
中得到的实际数据,就像这个输入一样,我应该在该日期前两天得到这样的输入。.cnf
28OCT2018
2018-10-26
答案1
带壳zsh
:
zmodload zsh/datetime
rel_date=2018OCT28
strftime -rs d %Y%b%d.%H $rel_date.12 &&
strftime -s two_days_before %Y-%m-%d $((d - 86400*2)) || exit
echo $two_days_before
答案2
Perl 可以用于以下用途:
perl -MTime::Piece -slE 'say +(Time::Piece->strptime($date, "%Y%b%d") - 2 * 86_400)->ymd' -- -date="$rel_date"
您指定传入日期变量的格式以将其解析为时间对象,执行日期算术,然后输出为所需的 YYYYY-mm-dd 格式。
答案3
您用 shell 标记了它,所以我假设该变量应该在 shell 中,但仅供参考,=
shell 变量周围不能有空格。
GNUdate
不会接受该格式的输入日期,但会接受它,28 OCT 2018
因此使用 shell 参数扩展我们可以重新排列日期(只要它始终采用相同的格式):
date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4}"
现在为了减去 2 天,我们只需添加:
date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4} - 2 days"
并以您要求的格式输出
date -d "${rel_date: -2} ${rel_date:4:3} ${rel_date:0:4} - 2 days" '+%Y-%m-%d'
答案4
了解您使用的是哪个 ksh{88,93} 可能很有用。
根据 ksh93(1) 你可以找到一些关于日期的信息:
printf format [ arg ... ]
%(date-format)T
--实际例子
: printf "%(%d.%m,%Y)T\n"
11.01,2019
: printf "%(%d.%m.%Y)T\n" "2 days ago"
09.01.2019