Как я могу напечатать дату за день до текущего времени в 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 date через gdate
команду. Смотрите: topbug.net/blog/2013/04/14/…
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
Расширенное руководство по Bash-скриптингу
date +%Y:%m:%d -d "yesterday"
Для получения подробной информации о формате даты см. Справочную страницу для даты
date --date='-1 day'
Извините, не говоря уже о системе Solaris. Таким образом, параметр -date недоступен в 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) используйте / 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
"
Вы можете выполнить простой расчет, используя регулярное выражение, если выбран формат даты «ГГГГММ»:
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
к солярису. Ваш ответ, основанный на непереносимых расширениях GNU для стандартной date
утилиты POSIX, на вопрос о платформе Solaris без GNU.
Попробуйте приведенный ниже код, который также заботится о части 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