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:
@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 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:
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.
$()
se prefiere a los backticks por legibilidad y otras razones .echo $(( $(date ...) / 86400 ))
Respuestas:
ring0 me ganó por unos segundos, pero el comando completo es:
Esto pasa por hora UTC. Resultado:
Una comprobación rápida con WolframAlpha muestra que este es el valor correcto.
fuente
El
date
comando puede darle la cantidad de segundos desde entonces1970-01-01 00:00:00 UTC
.Puede dividir el resultado entre
3600*24
para obtener el número de días (UTC).Por ejemplo, en Bash
para mostrar la cantidad de días.
fuente
Creo que este es el método más simple:
fuente
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):
. . . no se puede usar directamente en un cálculo, los modificadores correctos producirán lo que queremos:
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:
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.fuente