web-dev-qa-db-ja.com

ユーザーが入力した翌日の日付-日付+1日

スクリプティングは初めてです。ユーザーが入力した日付に基づいて翌日の日付を取得するには、AIX環境にスクリプトが必要です。

これを探すのに苦労した後、私は達成しなければならなかった目標の逆を行うコードを取得しました。ユーザーが入力した日付の1日前(昨日)に取得します。

コードはこれです

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

比較的最近のバージョンの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
0
glenn jackman

非常に基本的な/共通のモジュール(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日」に移行するのが難しくなります。

0
Ouki