Solución 1:
ring0 me ganó por unos segundos, pero el comando completo es:
echo $(($(date --utc --date "$1" +%s)/86400))
Esto va por hora UTC. Resultado:
[email protected]:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Una verificación rápida con WolframAlpha muestra que este es el valor correcto.
Solución 2:
Creo que este es el método más simple:
expr $(date +%s) / 86400
Solución 3:
El date
El comando puede darte la cantidad de segundos desde 1970-01-01 00:00:00 UTC
.
date +"%s"
Puedes dividir el resultado por 3600*24
para obtener el número de días (UTC).
P.ej. en bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
para mostrar el número de días.
Solución 4:
También necesitaba resolver esto, pero quería obtener el mismo valor para el día, independientemente de la hora del día. Con enfoques como los que se muestran aquí, el valor cambiará a la medianoche UTC en lugar de la medianoche hora local. Esto probablemente parezca un problema menor en la UE o la costa este de EE. UU., que están lo suficientemente cerca de UTC como para que el valor del día no cambie en medio de un día laboral típico, pero en, por ejemplo, California, el cambio de día ocurriría a las 4 p.m. PST, lo que podría ser un inconveniente. Imagino que a los australianos les molestaría especialmente que el valor del día cambiara a última hora de la mañana.
Si queremos corregir eso, debemos agregar el desplazamiento de UTC antes de dividir por segundos/día. Afortunadamente, el comando de fecha de Linux incluye un %z secuencia de formato que informa el desplazamiento de UTC. Mientras que el formato estándar (este resultado es para la hora de Denver, MDT):
$ date +%z
-0600
. . . no se puede usar directamente en un cálculo, los modificadores correctos producirán lo que queremos:
$ date +%-:::z
-6
Póngalo junto con las conversiones habituales de segundos/horas/días, y creo que lo siguiente debería generar los días desde el 1/1/1970, siendo el 1/1/1970 el día cero y el valor aumentando a la medianoche hora local:/P>
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Este cálculo simple no funcionará para las zonas horarias que no estén compensadas con UTC por horas enteras (por ejemplo, India, TZ=Asia/Kolkata), ya que el "+5:30" producido por date +%-:::z
producirá un error de "carácter no válido en la expresión" cuando se use en la declaración anterior.