Calcular días desde 1/1/1970

10

¿Cómo se puede calcular el número de días desde el 1/1/1970? Esto es para actualizar el atributo shadowLastChange en OpenLDAP.

¿Hay alguna manera de hacer esto usando el comando linux date ?

nitinas
fuente
En Bash y en las conchas derivadas de Bourne más modernas, $()se prefiere a los backticks por legibilidad y otras razones . echo $(( $(date ...) / 86400 ))
Pausado hasta nuevo aviso.
Todavía no tengo 2000 ... alguien puede editar y arreglar el título :-)
Anillo Ø

Respuestas:

20

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.

Dave Drager
fuente
1
¿Qué pasa con los segundos bisiestos? :)
netvope
1
@netvope Después de un segundo de salto adicional, el tiempo unix se restablece en uno nuevamente. Entonces cada día agrega exactamente 86400 segundos unix. Sin embargo, el tiempo de Unix 915148800 puede representar UTC 1998-12-31T23: 59: 60 y 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski
9

El datecomando puede darle la cantidad de segundos desde entonces 1970-01-01 00:00:00 UTC.

  date +"%s"

Puede dividir el resultado entre 3600*24para 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.

Ø de anillo
fuente
9

Creo que este es el método más simple:

expr $(date +%s) / 86400
Caballo oscuro
fuente
¿Por qué se rechaza esto? Es la respuesta mejor, más corta y más simple
Tom Corelis
1

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 +%-:::zproducirá un error de "carácter inválido en expresión" cuando se usa en la declaración anterior.

oracleif
fuente