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 ")
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-1dWedDec1415: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
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
17
MAC OS X
Para a data de ontem:
date -v-1d+%F
onde 1d define o dia atual menos 1 dia. Similarmente,
#!/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=12fiset`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 ;-)
Isso resulta no date: illegal option: -dSolaris. Sua resposta depende de extensões GNU não portáveis para o dateutilitário padrão POSIX para uma pergunta sobre a plataforma Solaris não GNU.
Andrew Henle
0
Experimente o código abaixo, que também cuida da parte do horário de verão.
É 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
ou-d
opção só está disponível na data GNURespostas:
se você tem data GNU e eu entendi corretamente
ou
fonte
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:Ou se você deseja fazer cálculos de data em uma data arbitrária:
fonte
fonte
date: illegal option -- -
date
, disponível através docoreutils
pacote, para fazer essa sintaxe funcionar no macOS. Se você estiver usando o Homebrew, poderá instalá-lo viabrew install coreutils
, após o qual você poderá usar a data GNU através dogdate
comando Veja: topbug.net/blog/2013/04/14/…MAC OS X
Para a data de ontem:
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,
Mais informações: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
fonte
Bem, esta é uma resposta tardia, mas isso parece funcionar !!
fonte
Guia Avançado de Script Bash
Para detalhes sobre o formato da data, consulte a página de manual da data
fonte
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.
fonte
bash $(TZ=America/New_York date +%Y-%m-%d)
Use Perl, talvez?
Ou use nawk e (ab) use / usr / bin / adb:
Deparei com isso também ... insano!
fonte
fonte
Coloca a data de ontem no formato AAAA-MM-DD na variável
$yesterday
.fonte
fonte
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':
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 ;-)
fonte
ou
fonte
date: illegal option: -d
Solaris. Sua resposta depende de extensões GNU não portáveis para odate
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.
Courtsey Ansgar Wiechers
fonte
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.
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:
fonte
Não é muito sexy, mas pode fazer o trabalho:
Formado a partir de "Martin Clayton" resposta.
fonte
fonte