사용자가 입력한 날짜의 다음날 - 날짜 + 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"

관련 정보