Obtenga la hora actual en segundos desde Epoch en Linux, Bash

Resuelto n-alexander asked hace 15 años • 7 respuestas

Necesito algo simple como date, pero en segundos desde 1970 en lugar de la fecha, horas, minutos y segundos actuales.

dateNo parece ofrecer esa opción. hay una manera fácil?

n-alexander avatar Jul 07 '09 21:07 n-alexander
Aceptado

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)

Steef avatar Jul 07 '2009 14:07 Steef

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 datees 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

pellucide avatar Sep 11 '2012 08:09 pellucide

Solución bash pura

Desde la bashversión 5.0 ( lanzada el 7 de enero de 2019 ), puede utilizar la variable incorporada EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

También existe EPOCHREALTIMEel que incluye fracciones de segundos.

$ echo $EPOCHREALTIME
1547624774.371210

EPOCHREALTIMEse 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 basharitmé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.

Socowi avatar Jan 14 '2019 08:01 Socowi

Hasta ahora, todas las respuestas utilizan el programa externo date.

Desde Bash 4.2, printftiene un nuevo modificador %(dateformat)Tque, cuando se usa con un argumento, -1genera la fecha actual con el formato dado por dateformat, manejado por strftime(3)( man 3 strftimepara 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 -2como 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
gniourf_gniourf avatar Nov 07 '2014 15:11 gniourf_gniourf

Con la mayoría de las implementaciones de Awk:

awk 'BEGIN {srand(); print srand()}'
Zombo avatar Dec 25 '2016 21:12 Zombo