用户输入日期的第二天 - 日期 +1 天

用户输入日期的第二天 - 日期 +1 天

我是脚本编写新手。我需要在 AIX 环境中编写一个脚本来根据用户输入的日期获取第二天的日期。

经过一番努力浏览之后,我得到了一段代码,它与我必须实现的目标相反。它让我得到用户输入日期的前一天(昨天)。

代码是这样的

#!/bin/ksh
echo "Enter the date (YYYY/MM/DD):"
read date
YEAR=`echo $date | cut -d"/" -f1`
MONTH=`echo $date | cut -d"/" -f2`
DAY=`echo $date | cut -d"/" -f3`
DAY=`expr "$DAY" - 1`
case "$DAY" in
0)
MONTH=`expr "$MONTH" - 1`
case "$MONTH" in
0)
MONTH=12
YEAR=`expr "$YEAR" - 1`
;;
esac
DAY=`cal $MONTH $YEAR | grep . | fmt -1 | tail -1`
esac
echo "Yesterday's Date is $YEAR/$MONTH/$DAY"

有人可以帮助实现获取用户输入日期的第二天吗?

期望的输出:

Enter the date (YYYY/MM/DD): 2013/09/30

Tomorrow's Date is 2013/10/1

答案1

使用相对较新的版本ksh93

$ printf "%(%Y/%m/%d)T\n" "2014/06/20 +1 day"
2014/06/21

或者:

$ printf "%(%Y/%m/%d)T\n" "2014/06/20 next day"
2014/06/21  
$ printf "%(%Y/%m/%d)T\n" "2014/06/20 tomorrow"
2014/06/21

答案2

很确定 AIX 默认情况下没有 GNU 日期。根据您的 perl 版本,您可以执行以下操作:

perl -MTime::Piece -MTime::Seconds -le '
    $tomorrow = Time::Piece->strptime($ARGV[0], "%Y/%m/%d") + ONE_DAY;
    print $tomorrow->ymd("/")
' 2013/10/28

所以,以克什

#!/bin/ksh
read date?"Enter the date (YYYY/MM/DD): "
tomorrow=$(
    perl -MTime::Piece -MTime::Seconds -le '
        $tomorrow = Time::Piece->strptime($ARGV[0], "%Y/%m/%d") + ONE_DAY;
        print $tomorrow->ymd("/")
    ' "$date"
)
echo "Tomorrow is $tomorrow"

运行这个看起来像:

Enter the date (YYYY/MM/DD): 2013/12/31
Tomorrow is 2014/01/01

在旧版本的 ksh 和 perl 上测试

$ what /usr/bin/ksh
/usr/bin/ksh:
        Version M-11/16/88i
        SunOS 5.8 Generic 110662-24 Apr 2007
$ perl --version

This is perl, v5.10.0 built for sun4-solaris

答案3

使用 Perl 方法,仅使用非常基本/通用的模块(Time::LocalPOSIX):

#!/bin/ksh
echo "Enter the date (YYYY/MM/DD):"
read date
timestamp=`perl -MTime::Local=timelocal -e '@t = split(/[-\/]/, $ARGV[0]); $t[1]--; print timelocal(1,1,1,reverse @t);' $date`
YESTERDAY=`perl -MPOSIX=strftime -e 'print strftime("%Y/%m/%d", localtime($ARGV[0] -86400));' $timestamp`
TODAY=`perl -MPOSIX=strftime -e 'print strftime("%Y/%m/%d", localtime($ARGV[0]));' $timestamp`
TOMORROW=`perl -MPOSIX=strftime -e 'print strftime("%Y/%m/%d", localtime($ARGV[0] +86400));' $timestamp`
echo "YESTERDAY= $YESTERDAY"
echo "TODAY= $TODAY"
echo "TOMORROW= $TOMORROW"

例子:

Enter the date (YYYY/MM/DD):
2014/02/28
YESTERDAY= 2014/02/27
TODAY= 2014/02/28
TOMORROW= 2014/03/01

如果没有该Time::Local模块,这仍然可以通过更多的痛苦来完成。然而,POSIX模块(strftime方法)是强制性的,因为它是事物的“智能”部分。如果没有它,就很难从“2 月 28 日”转到“3 月 1 日”。

答案4

printf "Enter the date (YYYY/MM/DD):" ; read user_date

desired_date=`date --date="$user_date+1 day" +"%Y/%m/%d"`

echo "Tomorrow's Date is $desired_date"

相关内容