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



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

1150   15  

15 ответов:

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

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

или

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

Если у вас есть 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
date --date='-1 day'

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

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

Advanced Bash-scripting Guide

date +%Y:%m:%d -d "yesterday"

для получения дополнительной информации о формате даты см. man-страницу для дата

date --date='-1 day'

MAC OSX

за вчерашний день:

date -v-1d +%F

здесь 1d определяет текущий день минус 1 день. Точно так же,

дата-v-1w +%F - для даты предыдущей недели

дата-v-1m +%F - для даты предыдущего месяца

ЕСЛИ У ВАС ЕСТЬ GNU ДАТА,

date --date="1 day ago"

Подробнее: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html

возможно, вместо этого используйте 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(/ /,"",);printf "0t%d=Y\n", -86400}' | adb

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

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

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
yesterday=`date -d "-1 day" %F`

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

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

date --date='-1 day'

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

DST aware решение:

манипулирование часовым поясом возможно для изменения часов несколько часов. В связи с переходом на летнее время, 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. В КШ вы можете использовать ту же команду без флага-е.

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

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

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

формируется из ответа "Мартин Клейтон".

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

Comments

    Ничего не найдено.