Як я можу надрукувати дату, що за день до поточного часу в Bash?
--date
Або -d
опція доступна тільки в даті GNU
Як я можу надрукувати дату, що за день до поточного часу в Bash?
--date
Або -d
опція доступна тільки в даті GNU
Відповіді:
якщо у вас є дата GNU, і я правильно вас зрозумів
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
або
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
на OSX (мінус), -v+1d
(плюс)
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 }
Якщо у вас є 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'
date: illegal option -- -
date
, доступну через coreutils
пакет, щоб цей синтаксис працював на macOS. Якщо ви використовуєте Homebrew, ви можете встановити його через brew install coreutils
, після чого ви зможете використовувати дату GNU через gdate
команду. Дивіться: topbug.net/blog/2013/04/14/…
MAC OSX
Для вчорашнього побачення:
date -v-1d +%F
де 1d визначає поточний день мінус 1 день. Аналогічно
дата -v-1w +% F - для дати попереднього тижня
дата -v-1m +% F - для дати попереднього місяця
ЯКЩО ВИ ДАТИ ГНУ,
date --date="1 day ago"
Більше інформації: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
Розширений посібник із сценаріїв Bash
date +%Y:%m:%d -d "yesterday"
Докладніше про формат дати див. На головній сторінці дати
date --date='-1 day'
Вибачте, що не згадую, що я в системі Solaris. Таким чином, перемикач -deta не доступний для Solaris bash.
Я дізнаюся, що я можу отримати попередню дату з невеликою хитрістю на часовому поясі.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
Можливо, використовувати 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
date --date='-1 day'
#!/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 July , 2013
, результат роздруковується 2013-6-1347
, тоді як очікуваний результат2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"
Ви можете виконати простий розрахунок із суцільним виразом, якщо обраний формат дати "YYYYMM":
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
У січні 2020 року він поверне 201912 ;-) Але це лише обхідне рішення, коли дата не має варіантів обчислення та інших варіантів інтерпретатора дат (наприклад, за допомогою perl) недоступні ;-)
date -d "yesterday" '+%Y-%m-%d'
або
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
Solaris. Ваша відповідь, яка покладається на непереносні розширення GNU до утиліти, що відповідає стандарту POSIX,date
на запитання про не-GNU-платформу Solaris.
Спробуйте наведений нижче код, який також піклується про частину 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'`
Кортсі Ансгар Візер
Рішення про 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
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9