Como posso imprimir a data um dia antes da hora atual no Bash?
--date
ou -d
opção só está disponível na data GNU
Como posso imprimir a data um dia antes da hora atual no Bash?
--date
ou -d
opção só está disponível na data GNU
Respostas:
se você tem data GNU e eu entendi corretamente
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
ou
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
no OSX (menos), -v+1d
(mais)
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 }
Se você tem BSD (OSX), date
pode fazê-lo assim:
date -j -v-1d
Wed Dec 14 15:34:14 CET 2011
Ou se você deseja fazer cálculos de data em uma data arbitrária:
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
, disponível através do coreutils
pacote, para fazer essa sintaxe funcionar no macOS. Se você estiver usando o Homebrew, poderá instalá-lo via brew install coreutils
, após o qual você poderá usar a data GNU através do gdate
comando Veja: topbug.net/blog/2013/04/14/…
MAC OS X
Para a data de ontem:
date -v-1d +%F
onde 1d define o dia atual menos 1 dia. Similarmente,
data -v-1w +% F - para a data da semana anterior
data -v-1m +% F - para a data do mês anterior
SE VOCÊ TEM DATA GNU,
date --date="1 day ago"
Mais informações: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
date +%Y:%m:%d -d "yesterday"
Para detalhes sobre o formato da data, consulte a página de manual da data
date --date='-1 day'
Desculpe não mencionar I no sistema Solaris. Como tal, a opção -date não está disponível no Solaris bash.
Descobri que posso obter a data anterior com um pequeno truque no fuso horário.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
Use Perl, talvez?
perl -e 'print scalar localtime( time - 86400 ) . "\n";'
Ou use nawk e (ab) use / usr / bin / adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb
Deparei com isso também ... insano!
/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
, o resultado que está sendo impresso é 2013-6-1347
, enquanto o resultado esperado é2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
"
Você pode fazer um cálculo simples, com uma expressão regular, se o formato de data escolhido for 'AAAAMM':
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
Em janeiro de 2020, ele retornará 201912 ;-) Mas é apenas uma solução alternativa, quando a data não tiver opções de cálculo e outras opções de intérpretes de data (por exemplo, usando perl) não disponíveis ;-)
date -d "yesterday" '+%Y-%m-%d'
ou
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
Solaris. Sua resposta depende de extensões GNU não portáveis para o date
utilitário padrão POSIX para uma pergunta sobre a plataforma Solaris não GNU.
Experimente o código abaixo, que também cuida da parte do horário de verão.
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 Ansgar Wiechers
Solução compatível com DST:
É possível manipular o fuso horário para alterar o relógio algumas horas. Devido ao horário de verão, 24 horas atrás pode ser hoje ou antes de ontem.
Você tem certeza que ontem é 20 ou 30 horas atrás. Qual? Bem, o mais recente que não é hoje.
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
O parâmetro -e usado no comando echo é necessário com o bash, mas não funcionará com o ksh. No ksh, você pode usar o mesmo comando sem o sinalizador -e.
Quando seu script será usado em ambientes diferentes, você poderá iniciar o script com #! / Bin / ksh ou #! / Bin / bash. Você também pode substituir o \ n por uma nova linha:
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