Получить дату (за день до текущего времени) в bash
Как я могу напечатать дату, которая за день до текущего времени в Bash?
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
Ну это поздний ответ,но это, кажется, работает!!
YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
echo $YESTERDAY;
расширенный Bash-руководство сценариев
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)используйте /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
Извините, что не упомянул I в системе 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
попробуйте приведенный ниже код, который также заботится о части 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 или #!/бин/Баш. Вы также можете заменить \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)'
сформировано из ответа" Мартин Клейтон".