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

问题描述 投票:0回答:20

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

bash unix date solaris
20个回答
319
投票

如果你有 GNU 日期并且我正确理解你的意思

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

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

62
投票

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

50
投票
date --date='-1 day'

29
投票

MAC OSX

昨天的日期:

date -v-1d +%F

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

日期 -v-1w +%F - 表示上周日期

日期 -v-1m +%F - 表示上个月的日期

如果您有 GNU DATE,

date --date="1 day ago"

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


8
投票

抱歉没有提及我在 Solaris 系统上的情况。 因此,-date 开关在 Solaris bash 上不可用。

我发现我可以通过时区上的小技巧来获取之前的日期。

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

8
投票

这是一个迟到的答案,但这似乎有效!

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

7
投票

高级 Bash 脚本编写指南

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

有关日期格式的详细信息,请参阅 date

的手册页
date --date='-1 day'

7
投票
date -d "yesterday" '+%Y-%m-%d'

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

4
投票

也许可以使用 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

4
投票



date --date='-1 day'

date --date='-1 day'


3
投票

不是很性感,但可以完成工作:

根据“马丁·克莱顿”答案格式化。


2
投票

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

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

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


2
投票

简短回答(GNU 格式):

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

如果您使用的是 OSX,但需要创建 GNU 兼容版本,请先安装 coreutils

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

然后编辑您的个人资料:

brew install coreutils

重新启动你的终端,现在你就可以使用GNU格式了!


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

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

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


1
投票
$yesterday

1
投票

DST 感知解决方案:

可以操纵时区来更改时钟几个小时。由于夏令时的原因,24小时前可以是今天或前天。

您确定昨天是 20 或 30 小时前。哪一个?好吧,最近的一个不是今天。

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

echo 命令中使用的 -e 参数在 bash 中需要,但在 ksh 中不起作用。在 ksh 中,您可以使用不带 -e 标志的相同命令。

当您的脚本将在不同的环境中使用时,您可以使用#!/bin/ksh 或#!/bin/bash 启动脚本。您还可以更换 通过换行符:

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

0
投票

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

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

考特西安斯加·维彻斯


0
投票

对于我的情况,我需要一个便携式解决方案来获取自一小时前的纪元以来的秒数,这在 ubuntu 和 macOS 上都有效:

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

解释一下:

  • $(( $(date +%s) - 3600 ))
    
    正在进行算术展开
  • $(( ))
    似乎是一种获取纪元以来秒数的便捷方式
  • 一小时3600秒

希望这有帮助!


0
投票
date +%s

-2
投票
echo $(date --date='yesterday')
© www.soinside.com 2019 - 2024. All rights reserved.