Tengo un script de shell que se ejecuta en Linux y utiliza esta llamada para obtener la fecha de ayer en YYYY-MM-DD
formato:
date -d "1 day ago" '+%Y-%m-%d'
Funciona la mayor parte del tiempo, pero cuando la secuencia de comandos se ejecutó ayer por la mañana en lugar de 2013-03-11 0:35 CDT
volver ."2013-03-09"
"2013-03-10"
Presumiblemente, el horario de verano (que comenzó ayer) es el culpable. Estoy adivinando el camino "1 day ago"
se implementa se resta 24 horas y 24 horas antes de la 2013-03-11 0:35 CDT
era 2013-03-09 23:35 CST
, lo que llevó al resultado de "2013-03-09"
.
Entonces, ¿cuál es una buena forma segura de DST de obtener la fecha de ayer en bash en Linux?
Respuestas:
Creo que esto debería funcionar, independientemente de con qué frecuencia y cuándo lo ejecute ...
fuente
date -d yesterday 13:00 -I
La fecha bajo Mac OSX es ligeramente diferente.
Para ayer
Para la semana pasada
fuente
gdate
, disponible en elcoreutils
paquete de homebrew .date
es diferente.Esto también debería funcionar, pero quizás sea demasiado:
fuente
date
que no admite layesterday
sintaxis ...Si está seguro de que el script se ejecuta en las primeras horas del día, simplemente puede hacer
Por cierto, si el script se ejecuta diariamente a las 00:35 (¿a través de crontab?), Debe preguntarse qué sucederá si un cambio de horario de verano cae en esa hora; el script no pudo ejecutarse, o ejecutarse dos veces en algunos casos. Sin embargo, las implementaciones modernas de
cron
son bastante inteligentes a este respecto.fuente
puedes usar
para obtener la fecha de hace 30 días, de manera similar, puede reemplazar 30 con x cantidad de días
fuente
%Y%m%d
que coincida con la pregunta. Voté de todos modos, ya que funcionó correctamente.Aquí una solución que también funcionará con Solaris y AIX.
La manipulación de la zona horaria es posible para cambiar el reloj algunas horas. Debido al horario de verano, hace 24 horas puede ser hoy o anteayer.
Estás seguro de que ayer fue hace 20 o 30 horas. ¿Cúal? Bueno, el más reciente que no es hoy.
El parámetro -e utilizado en el comando echo es necesario con bash, pero no funcionará con ksh. En ksh puede usar el mismo comando sin la bandera -e.
Cuando su script se utilizará en diferentes entornos, puede iniciar el script con #! / Bin / ksh o #! / Bin / bash. También puede reemplazar el \ n por una nueva línea:
fuente
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:
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:
Entonces,
o, de manera equivalente con una variable temporal (subshell externo opcional, pero mantiene el entorno vars limpio).
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)fuente
Para usar esto más tarde:
fuente
Puedes usar:
O cualquier momento que desee recuperar será recuperado por bash.
Por mes:
fuente
Como esta pregunta está etiquetada intento "DST seguro"
Y usando fork para
date
ordenar el retraso implícito, hay una manera simple y más eficiente de usar bash puro incorporado:Esto es mucho más rápido en más amigable sistema de tener que desembolsar a
date
.De intentoV> = 5.0 , hay una nueva variable
$EPOCHSECONDS
fuente