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

Posted

技术标签:

【中文标题】在 Bash 中获取日期(当前时间前一天)【英文标题】:Get the date (a day before current time) in Bash 【发布时间】:2010-12-14 23:31:46 【问题描述】:

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

【问题讨论】:

试用日期,但在 Solaris 10 的 bash 中似乎没有 -d 开关 我通过从 sunfreeware 安装 gnu date(coreutil 包)找到了另一个很好的解决方案。 AIX 的日期中也没有 -d 开关 --date-d 选项仅适用于 GNU 日期 请参阅 ***.com/q/15374752/462865 了解此问题的 DST 安全版本。 【参考方案1】:

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

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

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

【讨论】:

我发现大多数都是建议的答案,但在 Solaris 的日期中找不到 -d 开关 在 Ubuntu 上使用日期函数:$(date +%Y:%m:%d -d "1 day ago"),输出为:2013:04:21。如果你想要 10 天前的日期,你可以使用 $(date +%Y:%m:%d -d "10 days ago") 或 $(date +%Y:%m:%d -d "10一天前") 在 OS X 上,您可以通过 brew 安装 coreutils:参见 ***.com/questions/15374752/… date -v-1d on OSX(减号),-v+1d(加号) 这个 bash 函数可以在 Linux 和 OSX 上运行。基本上它首先尝试了 GNU Linux 风格。如果失败,它会尝试 OSX 样式。使用您想要日期的过去天数的参数调用它。如果您不传递任何参数,则假定为 0 天。这段代码是单行的,所以剪切和粘贴应该可以工作——假设没有行尾。 date_days_past () days_past=$1:-0; if ! date -v-$days_pastd +%Y%m%d 2>/dev/null; then date --date="-$days_past day" +%Y%m%d; fi 【参考方案2】:

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

【讨论】:

【参考方案3】:
date --date='-1 day'

【讨论】:

macOS Sierra 上的错误:date: illegal option -- - 您需要安装date 的GNU 版本,可通过coreutils 包获得,以使此语法在macOS 上工作。如果你使用 Homebrew,你可以通过brew install coreutils 安装它,之后你应该可以通过gdate 命令使用 GNU date。见:topbug.net/blog/2013/04/14/…【参考方案4】:

MAC OSX

对于昨天的日期:

date -v-1d +%F

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

date -v-1w +%F - 上一周的日期

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

如果你有 GNU DATE,

date --date="1 day ago"

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

Advanced Bash-scripting Guide

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

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

date --date='-1 day'

【讨论】:

【参考方案7】:

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

我发现我可以通过时区小技巧获得上一个日期。

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

【讨论】:

如果你碰巧住在使用夏令时的地方,这种方法不是 100% 可靠(实际上大约是 98%)。 不完全一样,可以使用bash $(TZ=America/New_York date +%Y-%m-%d) 【参考方案8】:
date -d "yesterday" '+%Y-%m-%d'

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

【讨论】:

这会导致 Solaris 上的 date: illegal option: -d。您的答案依赖于the POSIX-standard date utility 的非便携式 GNU 扩展来解决有关非 GNU Solaris 平台的问题。【参考方案9】:

也许改用 Perl?

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

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

nawk 'BEGINprintf "0t%d=Y\n", srand()-86400' | adb

也遇到了this...疯了!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400' | adb

【讨论】:

【参考方案10】:

date --date='-1 day'

【讨论】:

【参考方案11】:
yesterday=`date -d "-1 day" %F`

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

【讨论】:

【参考方案12】:
#!/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 用于更正,有趣的方法,尽管它有点冗长。 嗨 medoix,我找不到 $$# 的含义。我知道 $# 代表脚本/函数的参数数量。但我无法与此相关。请帮忙。 这在月份变化的前一天不起作用。例如今天是1 July , 2013,打印出来的结果是2013-6-1347,而预期的结果是2013-6-30 代替“fi”之间的 3 行尝试“day=echo $(cal $month $year)|tr ' ' '\n'|tail -n 1【参考方案13】:

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

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

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

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '$3=$3-1;print'
2009:11:9

【讨论】:

如果今天是 1 月 1 日呢?

以上是关于在 Bash 中获取日期(当前时间前一天)的主要内容,如果未能解决你的问题,请参考以下文章

js过去前一天日期

在shell中怎么获取当前日期和时间

oracle获取系统日期--当前时间+前一天+当前月+前一个月

获取当前时间及当前时间的前一天时间

批处理如何获取当前日期前一天的日期

java获取当前时间的前一天