ユーザーが入力した日の翌日 - 日付+ 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

だからkshで

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

Time::Local非常に基本的で一般的なモジュール(およびPOSIX)のみを使用してPerlアプローチを使用します。

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

関連情報