作为预先要求,我需要在 Unix (solaris) csh 中获取上个月的日期。
set Lmit_Date=`date --date='1 month ago' +%Y%m%d`
以上命令将获取上个月的日期并在 Linux 服务器上运行良好。但是我们的服务器是 Solaris 并且提到的命令不起作用。
谁能建议我如何获取上个月的日期
问题是由于您使用的是 GNU 日期扩展。
--date
是非标准的。
此外,由于月份长度是可变的,GNU date 显示的日期可能是意外的,至少可以说......
例如今天是 3 月 31 日,但根据 GNU 日期,“上个月”日期是 3 月 2 日:
$ date +%Y%m%d
20160331
$ date --date='1 month ago' +%Y%m%d
20160302
如果您仍然想在 Solaris 上使用 GNU 日期或找到一些解决方法,请查看这些回复: https://stackoverflow.com/a/23507108/211665 和https://stackoverflow.com/a/17817087/211665
您应该能够为您的 solaris 平台编译 coreutils,这将为您提供正确的日期实用程序。但是正如名称所说,coreutils 会覆盖核心实用程序,您可能希望将其安装到自定义路径中并通过您的特殊路径选择正确的日期命令,例如“/opt/coreutils/bin/date”。
另一种方法是使用符号日期输出拆分来计算上个月
eval `date +"set YEAR=%Y; set MONTH=%m ;set DAY=%d"`
现在您可以对“$YEAR”、“$MONTH”和“$DAY”进行操作了。例如
let 'MONTH--'
if [ "$MONTH" -eq 0 ]; then MONTH=12; let 'YEAR--'; fi
set Lmit_Date=`date --date "$MONTH$DAY0000$YEAR" +"%Y%m%d"`
有点。 (我习惯bash所以我不知道这里是否有
let
。但是还有一些其他方法可以进行shell计算。csh可能还有另一个关键字)。
您还需要使用 $DAY 参数注意每月的天数。
function last_day {
y=`echo $1 | cut -f1 -d "-"`
m=`echo $1 | cut -f2 -d "-"`
d=`cal ${m} ${y} | nawk 'NF{A=$NF}END{print A}'`
echo "$y $m $d" | nawk '{printf("%s-%02d-%02d",$1,$2,$3);}'
} # last_day
last_day 2023-01-01
会给你:2023-01-31 在非 GNU Solaris 中。