Respuestas:
ring0 me ganó por unos segundos, pero el comando completo es:
echo $(($(date --utc --date "$1" +%s)/86400))
Esto pasa por hora UTC. Resultado:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Una comprobación rápida con WolframAlpha muestra que este es el valor correcto.
El date
comando puede darle la cantidad de segundos desde entonces 1970-01-01 00:00:00 UTC
.
date +"%s"
Puede dividir el resultado entre 3600*24
para obtener el número de días (UTC).
Por ejemplo, en Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
para mostrar la cantidad de días.
Creo que este es el método más simple:
expr $(date +%s) / 86400
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 a la medianoche hora local. Probablemente esto no parezca un problema en la UE o en la costa este de los EE. UU., Que están lo suficientemente cerca de UTC para que el valor del día no cambie en el medio del día laboral típico, pero en, por ejemplo, California, el cambio del día ocurriría a las 4 p.m. PST, lo que podría ser inconveniente. Me imagino que los australianos estarían especialmente molestos por tener el cambio de valor del día a última hora de la mañana.
Si queremos corregir eso, necesitamos agregar el desplazamiento desde UTC antes de dividirlo por segundo / día. Afortunadamente, el comando de fecha de Linux incluye una secuencia de formato % z que informa el desplazamiento desde 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
Ponga eso junto con las conversiones habituales de segundos / horas / días, y creo que lo siguiente debería generar los días desde 1/1/1970, con 1/1/1970 en sí mismo siendo el día cero, y el valor incrementándose a la medianoche hora local:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Este simple cálculo no funcionará para zonas horarias que no están compensadas por UTC por horas completas (por ejemplo, India, TZ = Asia / Kolkata), ya que el "+5: 30" producido por date +%-:::z
producirá un error de "carácter inválido en expresión" cuando se usa en la declaración anterior.
$()
se prefiere a los backticks por legibilidad y otras razones .echo $(( $(date ...) / 86400 ))