Obtém a data do próximo sábado a partir de uma determinada data

4

Eu quero a data do próximo sábado depois de uma determinada data. Por exemplo, para $date1="30-AUG-2015" , quero o resultado 05-SEP-2015.

Eu tentei todos os comandos abaixo sem sucesso:

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date='"$date1" +next Saturday')
date: invalid date ‘"$date1" +next Saturday’

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date1='next Saturday')
date: unrecognized option '--date1=next Saturday'
Try 'date --help' for more information.

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date -d "$date1 next saturday"
Sun Aug 30 00:00:00 IST 2015
samba@samba:~$ $date1 -d "next saturday"
30-AUG-2015: command not found
    
por shiv 10.08.2015 / 21:17

4 respostas

5

Eu recomendo dateutils para coisas como esta. ( yum install dateutils no Fedora 21+ ou CentOS / RHEL 7 com EPEL.) Então, faça:

dateround today sunday

Você pode usar "hoje" ou substituir por uma data real:

$ dateround 2015-08-30 saturday
2015-09-05

Se você precisar que a data de entrada esteja em um formato específico, como o 30-AUG-2015, poderá usar o -i ou --input-format , como:

$ dateround -i '%d-%b-%Y'30-AUG-2015 saturday
2015-09-05
    
por 11.08.2015 / 01:32
3

com ksh93 :

$ LC_ALL=C ksh93 -c 'printf "%(%c)T\n" "30-Aug-2015 Saturday"'
Sat Sep  5 00:00:00 2015

Observe que, se a data for um sábado, ela retornará no mesmo dia, se você quiser o próximo sábado, faça isso:

LC_ALL=C printf "%(%c)T\n" "30-Aug-2015 tomorrow Saturday"

Substitua %c pela strftime que você deseja:

$ LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
10-Jan-2015

Com o GNU date :

$ d=03-JAN-2015
$ LC_ALL=C date -d "$d +1 week -$(date -d "$d +1 day" +%w) day" '+%d-%^b-%Y'
10-JAN-2015
    
por 10.08.2015 / 21:36
1

Eu presumo que você tentou um único comando. Não consegui encontrar uma, mas adaptei a esta resposta para fazer o que você quer:

# Assume that date1 is already set to "30-AUG-2015"
try_date="$date1"
while [ "$(date --date="$try_date" +"%A")" != Saturday ]
do
    try_date=$(date --date="$try_date + 1 day" +"%d-%b-%Y")
done
date2="$try_date"
echo "$date2"

Saída:

05-Sep-2015

Você pode alterar a linha while para

  • while [ "$(date --date="$try_date" +"%a")" != Sat ]
    ou
  • while [ "$(date --date="$try_date" +"%5")" != 6 ]
    (use 1 para segunda-feira… 7 para domingo)

Se $date1 for "29 de agosto de 2015" (que é um sábado), então $date2 será "29 de agosto de 2015" (ou seja, no mesmo dia). Se você ainda quiser obter 05-Set-2015 para esta entrada (ou seja, no próximo sábado após $date1 ), altere a primeira linha para try_date=$(date --date="$date1 + 1 day" +"%d-%b-%Y") .

Se você realmente deseja o mês em todas as maiúsculas (por exemplo, "SEP"), use tr .

    
por 11.08.2015 / 01:07
0

Minha melhor resposta para essa pergunta é:

IFS="#"; ((
for s_date in $(echo ${date1}' +'{1..7}' days#'); do 
date -d "${s_date}";
done
) | grep Sat
) | xargs -I {} date +%d-%b-%Y -d "{}"

Saída:

05-Sep-2015

Isso cria uma lista de sequências separadas por # , como:

"30-AUG-2015 +1 days# 30-AUG-2015 +2 days# 30-AUG-2015 +3 days# ..."

Essa lista é colocada em loop e passada para date , onde posso grep do dia que estou procurando (por exemplo, Sat). Por fim, posso usar xargs para converter a saída para o formato que você está procurando. O código pode ser colocado em uma única linha por conveniência.

    
por 26.04.2018 / 08:29