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


171

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


试用日期,但似乎Solaris 10的bash中没有-d开关
相当于2009年

通过从sunfreeware安装gnu date(coreutil软件包),我找到了另一个不错的解决方案。
conandor 2010年

AIX的日期中也没有-d开关
Frankster

--date-d选项仅在GNU可用日期
克里斯-约翰逊FA

有关此问题的DST安全版本,请参见stackoverflow.com/q/15374752/462865
阿米尔·阿里·阿克巴里

Answers:


262

如果您有GNU日期并且我正确理解了您

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

要么

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

1
我发现大多数都是建议的答案,但是-d开关在Solaris的日期中找不到
相当于2009年

3
对于日期功能为$$的Ubuntu的用法,输出为:2013:04:21。输出日期为:$(date +%Y:%m:%d -d“ 1 day ago”)。并且,如果您希望在10天前使用日期,则可以使用$(date +%Y:%m:%d -d“ 10 days ago”)或$(date +%Y:%m:%d -d“ 10天之前”)
zhihong

在OS X上,你可以通过BREW安装的coreutils:看stackoverflow.com/questions/15374752/...
kasterma

11
date -v-1d在OSX(减号)上,-v+1d(加号)
bgs 2016年

2
此bash功能将在Linux和OSX上均可用。基本上,它首先尝试GNU Linux风格。如果失败,则尝试OSX样式。使用您想要日期过去的天数作为参数来调用它。如果不传递任何参数,则假定为0天。这段代码是单行代码,因此剪切和粘贴应该起作用-不假定行尾。date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
诺亚·斯普里耶

50

如果您拥有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

41
date --date='-1 day'

4
在macOS Sierra上的错误:date: illegal option -- -
kuanb

2
您需要安装该软件包date提供的GNU版本coreutils,以使该语法在macOS上有效。如果您使用的是Homebrew,则可以通过进行安装brew install coreutils,此后您应该可以通过该gdate命令使用GNU date 。参见:topbug.ne​​t/blog/2013/04/14/…–
sumitsu


7

好吧,这是一个迟来的答案,但这似乎可行!

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


4

很抱歉在Solaris系统上没有提到I。因此,-date开关在Solaris bash上不可用。

我发现我可以在时区上获得一些技巧来获取先前的日期。

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

如果您恰好居住在使用夏时制的地方,则此方法不是100%可靠(实际上约为98%)。
jlliagre

不完全可以,您可以使用 bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002 '19

3

也许改用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


1
yesterday=`date -d "-1 day" %F`

将YYYY-MM-DD格式的昨天的日期放入variable中$yesterday


1
#!/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

+1用于校正,一种有趣的方法,即使有点冗长。
彼得·林德奎斯特

1
嗨,medoix,我无法找到$ {$#}的含义。我知道$#代表脚本/函数的参数数量。但我无法与此有关。请帮忙。
Karthick S '02

这对于月份变化的上一天无效。例如,今天是1 July , 2013,正在打印的结果是2013-6-1347,而期望的结果是2013-6-30
误导了2013年

而不是“ fi”之间的3行尝试“ day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
Anton Roslov

1

如果选择的日期格式为“ YYYYMM”,则可以使用正则表达式进行简单的计算:

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

在2020年1月,它将返回201912 ;-)但是,这只是一种解决方法,当日期没有计算选项并且其他日期解释器选项(例如,使用perl)不可用时;-)



0

尝试下面的代码,该代码也处理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


0

DST感知解决方案:

操纵时区可以在某些小时内更改时钟。由于夏令时,所以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

bash需要echo命令中使用的-e参数,但不适用于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

0

不太性感,但可以胜任:

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)'

格式为“马丁·克莱顿”的答案。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.