Obtenga la hora actual en segundos desde Epoch en Linux, Bash
Necesito algo simple como date
, pero en segundos desde 1970 en lugar de la fecha, horas, minutos y segundos actuales.
date
No parece ofrecer esa opción. hay una manera fácil?
Esto debería funcionar:
date +%s
Como se corrigió recientemente en el manual de fechas :
%s = segundos desde la Época (1970-01-01 00:00 UTC)
Sólo para agregar.
Obtenga los segundos desde la época (1 de enero de 1970) para cualquier fecha determinada (por ejemplo, 21 de octubre de 1973).
date -d "Oct 21 1973" +%s
Convertir el número de segundos a la fecha
date --date @120024000
El comando date
es bastante versátil. Otra cosa interesante que puedes hacer con la fecha (copiada descaradamente de date --help
). Muestra la hora local para las 9 a. m. del próximo viernes en la costa oeste de EE. UU.
date --date='TZ="America/Los_Angeles" 09:00 next Fri'
Mejor aún, tómate un tiempo para leer la página de manual http://man7.org/linux/man-pages/man1/date.1.html
Solución bash pura
Desde la bash
versión 5.0 ( lanzada el 7 de enero de 2019 ), puede utilizar la variable incorporada EPOCHSECONDS
.
$ echo $EPOCHSECONDS
1547624774
También existe EPOCHREALTIME
el que incluye fracciones de segundos.
$ echo $EPOCHREALTIME
1547624774.371210
EPOCHREALTIME
se puede convertir a microsegundos (μs) eliminando el punto decimal (o coma, si su configuración regional es francesa, alemana, etc.). Esto podría ser de interés cuando se utiliza la bash
aritmética incorporada (( expression ))
de que solo puede manejar números enteros.
$ echo ${EPOCHREALTIME/[^0-9]/}
1547624774371210
En todos los ejemplos anteriores, los valores de tiempo impresos son iguales para una mejor legibilidad. En realidad, los valores de tiempo diferirían ya que cada comando tarda una pequeña cantidad de tiempo en ejecutarse.
Hasta ahora, todas las respuestas utilizan el programa externo date
.
Desde Bash 4.2, printf
tiene un nuevo modificador %(dateformat)T
que, cuando se usa con un argumento, -1
genera la fecha actual con el formato dado por dateformat
, manejado por strftime(3)
( man 3 strftime
para obtener información sobre los formatos).
Entonces, para una solución Bash pura:
printf '%(%s)T\n' -1
o si necesita almacenar el resultado en una variable var
:
printf -v var '%(%s)T' -1
¡Sin programas externos ni subcapas!
Desde Bash 4.3, incluso es posible no especificar -1
:
printf -v var '%(%s)T'
(pero de todos modos sería más prudente dar siempre el argumento -1
).
Si usa -2
como argumento en lugar de -1
, Bash usará la hora en que se inició el shell en lugar de la fecha actual. Esto se puede utilizar para calcular los tiempos transcurridos.
$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422
Con la mayoría de las implementaciones de Awk:
awk 'BEGIN {srand(); print srand()}'