Получить дату следующей субботы с определенной даты

Я хочу дату предстоящей субботы после определенной даты. Например, для $date1="30-AUG-2015" я хочу получить результат 05-SEP-2015.

Я пробовал все команды ниже без успеха:

 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 

  • Как я могу передать $ 1 в sed?
  • Как конвертировать дату с «Oct 01 20:00» в формат «1 октября 20:00» (пробел)?
  • Может ли сервер Linux, который проходит проверку подлинности в Active Directory, принимает общедоступные / закрытые ключи для входа в систему без пароля?
  • Заменить текущий процесс на его coprocess / child
  • Запуск программы GUI при запуске
  • Сценарий, чтобы сравнить дату работы с сегодняшней датой и выводить только сегодняшние неудачи
  • Резервное копирование логического тома LVM2
  • Как программно запросить базу данных приложений Freedesktop?
  • 3 Solutions collect form web for “Получить дату следующей субботы с определенной даты”

    Я очень рекомендую dateutils для таких вещей. ( yum install dateutils на Fedora 21+ или CentOS / RHEL 7 с EPEL.) Затем просто выполните:

     dateround today sunday 

    Вы можете использовать «сегодня» или заменить фактическую дату:

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

    Если вам нужна дата ввода в определенном формате, например 30-AUG-2015, вы можете использовать -i или --input-format , например:

     $ dateround -i '%d-%b-%Y'30-AUG-2015 saturday 2015-09-05 

    С ksh93 :

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

    Обратите внимание, что если дата – суббота, то она вернется в тот же день, если вы захотите в следующую субботу, сделайте это:

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

    Замените %c параметром strftime вы хотите:

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

    date GNU:

     $ 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 

    Я исхожу из того, что вы пробовали, чтобы вам нужна одна команда. Я не мог найти его, но я адаптировал этот ответ, чтобы сделать то, что вы хотите:

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

    Вывод:

     05-Sep-2015 

    Вы можете изменить линию while на

    • while [ "$(date --date="$try_date" +"%a")" != Sat ]
      или
    • while [ "$(date --date="$try_date" +"%5")" != 6 ]
      (используйте 1 для понедельника … 7 для воскресенья)

    Если $date1 – «29 августа-2015» (это суббота), тогда $date2 будет «29 августа-2015» (т.е. в тот же день). Если вы все еще хотите получить 05-сентябрь-2015 для этого ввода (т. $date1 следующую субботу после $date1 ), измените первую строку на try_date=$(date --date="$date1 + 1 day" +"%d-%b-%Y") .

    Если вы действительно хотите месяц во всех столицах (например, «SEP»), используйте tr .

    Linux и Unix - лучшая ОС в мире.