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;
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
попробуйте приведенный ниже код, который также заботится о части 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)'формируется из ответа "Мартин Клейтон".
Comments