在Bash中获取日期(比当前时间早一天)

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

336668 次浏览

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

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

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
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
yesterday=`date -d "-1 day" %F`

将昨天的日期以YYYY-MM-DD格式放入变量$yesterday中。

高级Bash-scripting Guide .

date +%Y:%m:%d -d "yesterday"

有关日期格式的详细信息,请参阅日期的手册页

date --date='-1 day'

<代码>

date --date='-1 day'

> < /代码

date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9

也许改用Perl ?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

或者使用nawk, (ab)使用/usr/bin/adb:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

也遇到了…疯了!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb
对不起,在Solaris系统上没有提到I。 因此,Solaris bash上的-date开关不可用

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

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

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

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

好吧,这是一个晚的答案,但这似乎是有效的!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
echo $YESTERDAY;

试试下面的代码,它也处理DST部分。

if [ $(date +%w) -eq $(date -u +%w) ]; then
tz=$(( 10#$gmthour - 10#$localhour ))
else
tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`

启发性Ansgar Wiechers指出

支持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

MAC OSX

昨天的日期:

date -v-1d +%F

其中1 d定义当前减去1天。同样的,

-v-1w +%F -前一周日期

日期-v-1m +%F -用于上个月的日期

如果你有gnu日期,

date --date="1 day ago"

更多信息:https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html

不是很性感,但可以胜任:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

由“马丁·克莱顿”的答案形成。

如果选择的日期格式是'YYYYMM',你可以用正则表达式做一个简单的计算:

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

在2020年1月,它将返回2011912;-) 但是,这只是一个变通方法,当date没有计算选项和其他日期解释器选项(例如使用perl)不可用时;-)

date -d "yesterday" '+%Y-%m-%d'

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date

如果你正在使用OSX,但你需要创建GNU兼容,首先安装coreutils

brew install coreutils

然后编辑您的个人资料:

#gnu coreutils first
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

重新启动您的终端,现在您可以使用GNU格式:

date +%Y-%m-%d -d "-2 day"