No dia seguinte do usuário inserido data - data +1 dia

5

Eu sou novo em scripts. Eu preciso de um script no ambiente AIX para obter a data dos próximos dias com base na data inserida pelo usuário.

Depois de muito tempo procurando por isso, eu peguei um pedaço de código que faz o reverso do objetivo que eu tinha que alcançar. Isso me pega um dia antes (ontem) da data inserida pelo usuário.

O código é este

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

Alguém por favor pode ajudar a conseguir o próximo dia da data de inscrição do usuário.

Saída desejada:

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

Tomorrow's Date is 2013/10/1
    
por cm60 28.10.2013 / 14:18

5 respostas

2

Com versões relativamente recentes de ksh93 :

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

Ou:

$ 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
    
por 05.07.2014 / 10:35
0

Certamente, o AIX não tem data do GNU por padrão. Dependendo da sua versão do perl, você pode fazer:

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

Então, em 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"

A execução é assim:

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

Testado em uma versão antiga do ksh e 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
    
por 28.10.2013 / 18:52
0

Usando a abordagem Perl, com apenas módulos muito básicos / comuns ( Time::Local e POSIX ):

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

Exemplo:

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

Se não tiver o módulo Time::Local , isso ainda pode ser feito com um pouco mais de dor. No entanto, o módulo POSIX ( strftime method) é obrigatório como sendo a parte "inteligente" da coisa. Sem isso, seria difícil passar de "28-fev" para "01-mar".

    
por 23.03.2014 / 12:33
-1

Você pode tentar o seguinte:

currDate=$(date); nextDay=$(date -d "$currDate + 1 day" +"%Y-%m-%d"); echo "$nextDay"
    
por 28.10.2013 / 14:28
-1
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"
    
por 28.10.2013 / 15:43

Tags