Eu tenho um script de shell que roda no Linux e usa essa chamada para obter a data de ontem no YYYY-MM-DD
formato:
date -d "1 day ago" '+%Y-%m-%d'
Funciona na maioria das vezes, mas quando o script foi executado ontem de manhã 2013-03-11 0:35 CDT
, retornou em "2013-03-09"
vez de "2013-03-10"
.
Presumivelmente, o horário de verão (que começou ontem) é o culpado. Eu estou supondo que a maneira como "1 day ago"
é implementada subtraiu 24 horas, e 24 horas antes 2013-03-11 0:35 CDT
era 2013-03-09 23:35 CST
, o que levou ao resultado de "2013-03-09"
.
Então, qual é uma boa maneira segura de horário de verão para obter a data de ontem no bash no Linux?
Respostas:
Eu acho que isso deve funcionar, independentemente de quantas vezes e quando você o executa ...
fonte
date -d yesterday 13:00 -I
A data no Mac OSX é um pouco diferente.
Para ontem
Na semana passada
fonte
gdate
, disponível nocoreutils
pacote homebrew .date
é diferente.Isso também deve funcionar, mas talvez seja demais:
fonte
date
que não suportayesterday
a sintaxe ...Se você tem certeza de que o script é executado nas primeiras horas do dia, você pode simplesmente fazer
BTW, se o script for executado diariamente às 00:35 (via crontab?), Você deve se perguntar o que acontecerá se uma alteração no horário de verão cair nessa hora; o script não pôde ser executado ou executado duas vezes em alguns casos. As implementações modernas de
cron
são bastante inteligentes nesse sentido, no entanto.fonte
você pode usar
para obter a data de 30 dias atrás, da mesma forma, você pode substituir 30 pela quantidade de dias x
fonte
%Y%m%d
para corresponder à pergunta. Eu votei de qualquer maneira, pois funcionou corretamente.Aqui está uma solução que também funcionará com Solaris e AIX.
É 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
Basta usar
date
e segundos confiáveis:Como você corretamente aponta, muitos detalhes sobre o cálculo subjacente ficam ocultos se você confiar na aritmética do tempo em inglês. Por exemplo
-d yesterday
, e-d 1 day ago
terá um comportamento diferente.Em vez disso, você pode confiar de forma confiável nos segundos (documentados com precisão) desde a época UTC do unix, e na aritmética do bash para obter o momento que deseja:
Isso foi apontado em outra resposta . Esse formulário é mais portátil em plataformas com diferentes
date
sinalizadores de linha de comando, é independente do idioma (por exemplo, "ontem" vs "hier" na localidade francesa) e, francamente (a longo prazo), será mais fácil lembrar, porque, bem, você já sabe disso. Caso contrário, você pode continuar se perguntando: "Foi-d 2 hours ago
ou de-d 2 hour ago
novo?" ou "É-d yesterday
ou-d 1 day ago
eu quero?"). A única parte complicada aqui é a@
.Armado com bash e nada mais:
Bash apenas no bash, você também pode obter o horário de ontem, através do printf incorporado:
Assim,
ou, de forma equivalente a uma variável temp (subshell externo opcional, mas mantém os vars do ambiente limpos).
Nota: apesar da página de manual declarando que nenhum argumento para o
%()T
formatador assumirá um padrão-1
, parece que recebo um 0 (obrigado, versão manual do bash 4.3.48)fonte
Para usar isso mais tarde:
fonte
Você pode usar:
Ou a hora que você deseja recuperar será recuperada pelo bash.
Por mês:
fonte
Como esta pergunta está marcada festança "DST safe"
E usando o fork para
date
comandar o atraso implie, existe uma maneira simples e mais eficiente de usar o bash puro incorporado:Isto é muito mais rápido em mais sistema amigável do que ter que desembolsar para
date
.De festançaV> = 5.0 , há uma nova variável
$EPOCHSECONDS
fonte