Solo usa date
y segundos de confianza:
Como señala correctamente, muchos de los detalles sobre el cálculo subyacente se ocultan si confía en la aritmética del tiempo en inglés. Por ejemplo -d yesterday
, y-d 1 day ago
tendrá un comportamiento diferente.
En cambio, puede confiar de manera confiable en los segundos (documentados con precisión) desde el UTC de época de Unix y la aritmética de bash para obtener el momento que desee:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Esto se señaló en otra respuesta . Este formulario es más portátil en todas las plataformas con diferentes date
indicadores de línea de comandos, es independiente del idioma (por ejemplo, "ayer" frente a "hier" en francés) y, francamente (a largo plazo), será más fácil de recordar, porque bueno, usted ya lo se. De lo contrario, podría seguir preguntándose: "¿Fue -d 2 hours ago
o fue de -d 2 hour ago
nuevo?" o "¿Es -d yesterday
o -d 1 day ago
eso quiero?"). Lo único difícil aquí es el@
.
Armado con bash y nada más:
Bash únicamente en bash, también puede obtener la hora de ayer, a través de 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.
Entonces,
# 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 ))
o, de manera equivalente con una variable temporal (subshell externo opcional, pero mantiene el entorno vars limpio).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Nota: a pesar de que la página de manual indica que ningún argumento para el %()T
formateador asumirá un valor predeterminado -1
, parece que obtengo un 0 en su lugar (gracias, bash manual versión 4.3.48)