如何在Bash中打印当前时间前一天的日期?


当前回答

如果你有GNU日期,我理解正确

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

or

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

其他回答

如果你有BSD (OSX)日期,你可以这样做:

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

或者如果你想在任意日期上进行日期计算:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
date --date='-1 day'
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day

支持DST的解决方案:

通过操作时区可以将时钟调整几个小时。由于是夏时制,24小时前可以是今天也可以是前天。

你确定昨天是二三十小时前。哪一个?最近的一次不是今天。

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

echo命令中使用的-e参数在bash中是必需的,但在ksh中无效。在ksh中,您可以使用相同的命令,不带-e标志。

当您的脚本将在不同的环境中使用时,您可以使用#!/bin/ksh或#!/bin/bash你也可以用换行符替换\n:

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

对不起,在Solaris系统上没有提到我。 因此,-date开关在Solaris bash上不可用。

我发现我可以得到之前的日期与小技巧的时区。

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE