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
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
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
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
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".
Você pode tentar o seguinte:
currDate=$(date); nextDay=$(date -d "$currDate + 1 day" +"%Y-%m-%d"); echo "$nextDay"
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"