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:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
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:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
Assim,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
ou, de forma equivalente a uma variável temp (subshell externo opcional, mas mantém os vars do ambiente limpos).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
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)