Obter a data (um dia antes da hora atual) no Bash


171

Como posso imprimir a data um dia antes da hora atual no Bash?


Data tentei, mas parece que não há nenhuma opção -d no Solaris 10 da festa
conandor

Encontrei outra ótima solução instalando o gnu date (pacote coreutil) do sunfreeware.
conandor

nem existe uma opção -d na data do AIX
#

A --dateou -dopção só está disponível na data GNU
Chris FA Johnson

Consulte stackoverflow.com/q/15374752/462865 para obter uma versão segura para DST desta pergunta.
Amir Ali Akbari

Respostas:


262

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

1
Eu encontrei a maioria são como resposta sugerida, mas parâmetro -d não é encontrado em do Solaris data
conandor

3
Para o uso no Ubuntu com a função date: $ (date +% Y:% m:% d -d "1 dia atrás"), a saída é: 2013: 04: 21. E se você quiser a data 10 dias antes, poderá usar $ (data +% Y:% m:% d -d "10 dias atrás") ou $ (data +% Y:% m:% d -d "10 dia atrás ")
zhihong

No OS X você pode instalar coreutils através bebida: ver stackoverflow.com/questions/15374752/...
kasterma

11
date -v-1dno OSX (menos), -v+1d(mais)
bgs

2
Essa função bash funcionará no Linux e no OSX. Basicamente, ele tenta primeiro o estilo GNU Linux. Se isso falhar, ele tenta o estilo OSX. Chame-o com um argumento do número de dias no passado em que você deseja a data. Se você não passar nenhum argumento, ele assume 0 dias. Esse código é de uma linha, portanto, recortar e colar deve funcionar - nenhuma extremidade de linha assumida. 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 }
Noah Spurrier

50

Se você tem BSD (OSX), datepode 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

41
date --date='-1 day'

4
Erros no macOS Sierra:date: illegal option -- -
kuanb 3/17/17

2
Você precisa instalar a versão GNU date, disponível através do coreutilspacote, 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 gdatecomando Veja: topbug.net/blog/2013/04/14/…
sumitsu


7

Bem, esta é uma resposta tardia, mas isso parece funcionar !!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

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

Este método não é 100% confiável (cerca de 98%, na verdade) se você mora em um local usando o horário de verão.
Jlliagre

Não exatamente, você pode usar bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

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


1
yesterday=`date -d "-1 day" %F`

Coloca a data de ontem no formato AAAA-MM-DD na variável $yesterday.


1
#!/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 para correção, método interessante, mesmo que seja um pouco detalhado.
22411 Peter Lindqvist

1
Olá medoix, não consigo encontrar o significado de $ {$ #}. Eu sei que $ # representa o número de argumentos para um script / função. Mas não sou capaz de me relacionar com isso. Por favor ajude.
Karthick S

Isso não funciona no dia anterior na mudança de mês. Por exemplo, hoje é 1 July , 2013, o resultado que está sendo impresso é 2013-6-1347, enquanto o resultado esperado é2013-6-30
mal orientado

Em vez das 3 linhas entre o dia "fi" try "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov 10/07/13

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 ;-)



0

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


0

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

0

Não é muito sexy, mas pode fazer o trabalho:

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)'

Formado a partir de "Martin Clayton" resposta.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.