在Bash中获取date(当前时间的前一天)

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

如果你有GNU的date,我正确地理解你

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

要么

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

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

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

或者,如果您想在任意date进行date计算:

 date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d" 2011-08-31 
 date --date='-1 day' 

那么这是一个迟到的答案,但这似乎工作!

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

高级Bash脚本指南

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

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

 date --date='-1 day' 

也许用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系统上。 因此,-date开关在Solaris bash上不可用。

我发现我可以用时区上的小动作来获得上一个date。

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

--date-d选项仅在GNUdate中可用。

 $ date --date 'yesterday' +%F date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] 
 yesterday=`date -d "-1 day" %F` 

将昨天的YYYY-MM-DD格式的date放到昨天的variables$yesterday

 #!/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 
 date --date='-1 day' 

MAC OSX

对于昨天的date:

 date -v-1d +%F 

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

date-v-1w +%F – 前一周的date

date-v-1m +%F – 上个月的date

如果你有GNU DATE,

 date --date="1 day ago" 

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

试试下面的代码,它也负责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'` 

Courtsey Ansgar Wiechers

DST感知解决scheme:

操作时区可能会在几个小时内改变时钟。 由于夏令时,24小时前可以是今天或前天。

你确定昨天是20或30小时前。 哪一个? 那么,最近的一个不是今天。

 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启动脚本。 您也可以用换行符replace\ n:

 echo "$(TZ=GMT+30 date +%Y-%m-%d) $(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1 
 date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}' 2009:11:9