Я нашел, что большинство - как предложенный ответ, но ключ -d не найден в дате Соляриса
conandor
3
Для использования в Ubuntu с функцией даты: $ (дата +% Y:% m:% d -d "1 день назад") вывод: 2013: 04: 21. И если вам нужна дата за 10 дней до, вы можете использовать $ (дата +% Y:% m:% d -d "10 дней назад") или $ (дата +% Y:% m:% d -d "10 день назад ")
Эта функция bash будет работать как в Linux, так и в OSX. По сути, он сначала пробует стиль GNU Linux. Если это не удается, он пытается стиль OSX. Назовите его аргументом количества дней в прошлом, когда вы хотите дату. Если вы не передадите ни одного аргумента, это займет 0 дней. Этот код является однострочным, поэтому вырезание и вставка должны работать - окончания строк не предполагаются. date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Ноа Спурриер
50
Если у вас есть BSD (OSX), dateвы можете сделать это следующим образом:
date -j -v-1dWedDec1415:34:14 CET 2011
Или, если вы хотите сделать расчет даты на произвольную дату:
date -j -v-1d-f "%Y-%m-%d""2011-09-01""+%Y-%m-%d"2011-08-31
Вам нужно установить версию GNU date, доступную через coreutilsпакет, чтобы этот синтаксис работал в macOS. Если вы используете Homebrew, вы можете установить его через brew install coreutils, после чего вы сможете использовать GNU date через gdateкоманду. Смотрите: topbug.net/blog/2013/04/14/…
sumitsu
17
MAC OS X
Для вчерашней даты:
date -v-1d+%F
где 1d определяет текущий день минус 1 день. Так же,
#!/bin/bash
OFFSET=1;eval`date "+day=%d; month=%m; year=%Y"`# Subtract offset from day, if it goes below one use 'cal'# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`if[ $day -le 0];then
month=`expr $month - 1`if[ $month -eq 0];then
year=`expr $year - 1`
month=12fiset`cal $month $year`
xday=${$#}
day=`expr $xday + $day`fi
echo $year-$month-$day
+1 за исправление, интересный метод, хотя он немного многословен.
Питер Линдквист
1
Здравствуйте, medoix, я не могу найти значение $ {$ #}. Я знаю, что $ # обозначает количество аргументов скрипта / функции. Но я не могу относиться к этому. Пожалуйста помоги.
Картик С
Это не работает для предыдущего дня при смене месяца. Например, сегодня 1 July , 2013результат распечатывается так 2013-6-1347, а ожидаемый результат2013-6-30
ошибочный
Вместо 3-х строк между "фи" попробуйте "день = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Антон Рослов
1
Вы можете выполнить простой расчет, используя регулярное выражение, если выбран формат даты «ГГГГММ»:
echo $(($(date +"%Y%m")-1))| sed -e 's/99$/12/'
В январе 2020 года он вернет 201912 ;-) Но это всего лишь обходной путь, когда у даты нет опций вычисления, а другие опции интерпретатора даты (например, с использованием perl) недоступны ;-)
Это приводит date: illegal option: -dк солярису. Ваш ответ, основанный на непереносимых расширениях GNU для стандартной dateутилиты POSIX, на вопрос о платформе Solaris без GNU.
Эндрю Хенле
0
Попробуйте приведенный ниже код, который также заботится о части DST.
Управление часовым поясом возможно для смены часов на несколько часов. Из-за перехода на летнее время 24 часа назад может быть сегодня или позавчера.
Вы уверены, что вчера 20 или 30 часов назад. Который из? Ну, самый последний, которого нет сегодня.
echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)"| grep -v $(date +%Y-%m-%d)| tail -1
Параметр -e, используемый в команде echo, необходим для bash, но не будет работать с ksh. В ksh вы можете использовать ту же команду без флага -e.
Когда ваш скрипт будет использоваться в разных средах, вы можете запустить скрипт с помощью #! / Bin / ksh или #! / Bin / bash. Вы также можете заменить \ n символом новой строки:
echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)"| grep -v $(date +%Y-%m-%d)| tail -1
--date
или-d
доступна только в дате GNUОтветы:
если у вас дата GNU и я вас правильно понял
или
источник
date -v-1d
на OSX (минус),-v+1d
(плюс)date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Если у вас есть BSD (OSX),
date
вы можете сделать это следующим образом:Или, если вы хотите сделать расчет даты на произвольную дату:
источник
источник
date: illegal option -- -
date
, доступную черезcoreutils
пакет, чтобы этот синтаксис работал в macOS. Если вы используете Homebrew, вы можете установить его черезbrew install coreutils
, после чего вы сможете использовать GNU date черезgdate
команду. Смотрите: topbug.net/blog/2013/04/14/…MAC OS X
Для вчерашней даты:
где 1d определяет текущий день минус 1 день. Так же,
date -v-1w +% F - за предыдущую неделю
дата -v-1m +% F - за предыдущий месяц
ЕСЛИ У ВАС ГНУ ДАТА,
Дополнительная информация: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tgotis-date.html
источник
Ну, это поздний ответ, но, похоже, это работает!
источник
Расширенное руководство по Bash-скриптингу
Для получения подробной информации о формате даты см. Справочную страницу для даты
источник
Извините, не говоря уже о системе Solaris. Таким образом, параметр -date недоступен в Solaris bash.
Я узнаю, что могу получить предыдущую дату с небольшим фокусом на часовом поясе.
источник
bash $(TZ=America/New_York date +%Y-%m-%d)
Возможно, вместо этого использовать Perl?
Или используйте nawk и (ab) используйте / usr / bin / adb:
Наткнулся на это тоже ... безумно!
источник
источник
Переводит вчерашнюю дату в формате ГГГГ-ММ-ДД в переменную
$yesterday
.источник
источник
1 July , 2013
результат распечатывается так2013-6-1347
, а ожидаемый результат2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"Вы можете выполнить простой расчет, используя регулярное выражение, если выбран формат даты «ГГГГММ»:
В январе 2020 года он вернет 201912 ;-) Но это всего лишь обходной путь, когда у даты нет опций вычисления, а другие опции интерпретатора даты (например, с использованием perl) недоступны ;-)
источник
или
источник
date: illegal option: -d
к солярису. Ваш ответ, основанный на непереносимых расширениях GNU для стандартнойdate
утилиты POSIX, на вопрос о платформе Solaris без GNU.Попробуйте приведенный ниже код, который также заботится о части DST.
Кортси Ансгар Вичерс
источник
DST осведомленное решение:
Управление часовым поясом возможно для смены часов на несколько часов. Из-за перехода на летнее время 24 часа назад может быть сегодня или позавчера.
Вы уверены, что вчера 20 или 30 часов назад. Который из? Ну, самый последний, которого нет сегодня.
Параметр -e, используемый в команде echo, необходим для bash, но не будет работать с ksh. В ksh вы можете использовать ту же команду без флага -e.
Когда ваш скрипт будет использоваться в разных средах, вы можете запустить скрипт с помощью #! / Bin / ksh или #! / Bin / bash. Вы также можете заменить \ n символом новой строки:
источник
Не очень сексуально, но может сделать работу:
Создан из "Мартина Клейтона" ответ.
источник
источник