Получить дату (за день до текущего времени) в Баш


171

Как я могу напечатать дату за день до текущего времени в Bash?


Пробовал дату, но кажется, что в bash Solaris 10 нет переключателя -d
conandor

Я нашел другое отличное решение, установив gnu date (пакет coreutil) из sunfreeware.
Конандор

также нет переключателя -d в дате AIX
frankster

Опция --dateили -dдоступна только в дате GNU
Крис Ф. А. Джонсон

См. Stackoverflow.com/q/15374752/462865 для DST-безопасной версии этого вопроса.
Амир Али Акбари

Ответы:


262

если у вас дата GNU и я вас правильно понял

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

или

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

1
Я нашел, что большинство - как предложенный ответ, но ключ -d не найден в дате Соляриса
conandor

3
Для использования в Ubuntu с функцией даты: $ (дата +% Y:% m:% d -d "1 день назад") вывод: 2013: 04: 21. И если вам нужна дата за 10 дней до, вы можете использовать $ (дата +% Y:% m:% d -d "10 дней назад") или $ (дата +% Y:% m:% d -d "10 день назад ")
zhihong

На OS X можно установить Coreutils через варку: см stackoverflow.com/questions/15374752/...
kasterma

11
date -v-1dна OSX (минус), -v+1d(плюс)
BGS

2
Эта функция 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-1d
Wed Dec 14 15:34:14 CET 2011

Или, если вы хотите сделать расчет даты на произвольную дату:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31

41
date --date='-1 day'

4
Erros на macOS Sierra:date: illegal option -- -
kuanb

2
Вам нужно установить версию 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 день. Так же,

date -v-1w +% F - за предыдущую неделю

дата -v-1m +% F - за предыдущий месяц

ЕСЛИ У ВАС ГНУ ДАТА,

date --date="1 day ago"

Дополнительная информация: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tgotis-date.html


7

Ну, это поздний ответ, но, похоже, это работает!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

Извините, не говоря уже о системе Solaris. Таким образом, параметр -date недоступен в Solaris bash.

Я узнаю, что могу получить предыдущую дату с небольшим фокусом на часовом поясе.

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE

Этот метод не является надежным на 100% (на самом деле около 98%), если вы живете в месте, где используется летнее время.
Jlliagre

Не совсем, вы можете использовать bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

Возможно, вместо этого использовать Perl?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

Или используйте nawk и (ab) используйте / usr / bin / adb:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

Наткнулся на это тоже ... безумно!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb


1
yesterday=`date -d "-1 day" %F`

Переводит вчерашнюю дату в формате ГГГГ-ММ-ДД в переменную $yesterday.


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=12
fi
set `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) недоступны ;-)



0

Попробуйте приведенный ниже код, который также заботится о части DST.

if [ $(date +%w) -eq $(date -u +%w) ]; then
  tz=$(( 10#$gmthour - 10#$localhour ))
else
  tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`

Кортси Ансгар Вичерс


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

0

Не очень сексуально, но может сделать работу:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

Создан из "Мартина Клейтона" ответ.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.