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

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

Ответ 1

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

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

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

Ответ 2

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

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

или

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

Ответ 3

Если у вас есть 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

Ответ 4

date --date='-1 day'

Ответ 5

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

Ответ 6

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

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

Ответ 8

Вместо этого используйте Perl?

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

Или используйте nawk и (ab) use/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

Ответ 9

Опция --date или -d доступна только в дате GNU.

$ date --date 'yesterday' +%F
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
        [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]

Ответ 10

#!/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

Ответ 11

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

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

Ответ 12

date --date='-1 day'

код >

Ответ 13

Вы можете выполнить простой расчет, используя регулярное выражение, если выбран формат даты "ГГГГММ":

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

В январе 2020 года он вернет 201912 ;-) Но это только обходной путь, когда у даты нет опций вычисления и другие опции интерпретатора даты (например, с использованием perl) недоступны ;-)

Ответ 14

Попробуйте приведенный ниже код, который также заботится о части 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'`

Courtsey Ansgar Wiechers

Ответ 15

Решение 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.

Когда ваш script будет использоваться в разных средах, вы можете запустить script с помощью #!/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

Ответ 16

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

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)'

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

Ответ 17

date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9