2009-07-07 47 views
396

Necesito algo simple como date, pero en segundos desde 1970 en lugar de la fecha actual, horas, minutos y segundos.Obtener el tiempo actual en segundos desde el Epoch en Linux, Bash

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

+18

Lo sentimos, hay que decir esto .... '' Fecha no parece una oferta esa opción. ¿Hay alguna manera fácil? '' - lea el manual nuevamente ;-) – TheBonsai

+5

Algunas versiones de fecha lo tienen y otras no. Por lo tanto, no siempre está presente. Ejecuté 'type-date' y usé una versión diferente y funcionó. –

+0

FWIW, Ubuntu solo tiene/bin/date, para lo cual la respuesta de @ Steef funciona –

Respuesta

747

Esto debería funcionar:

date +%s 
+27

la fecha manpge debe cambiarse de '% s segundos desde 1970-01-01 00:00:00 UTC' a'% s segundos desde la época , 1970-01-01 00:00:00 UTC' porque me lo perdí allí. – devin

+3

No funciona para mí. la fecha del hombre no muestra% s. Debo tener una versión muy antigua de bash (3.2.51 (1) para Solaris)? – livefree75

+3

@ livefree75 'date' no está integrado en' bash', por lo que su versión de 'bash' no tiene nada que ver con la implementación de' fecha' con la que se envía el sistema. –

91

sólo para añadir. Si desea obtener los segundos desde época (1 de enero de 1970) para cualquier fecha (por ejemplo, 21 de octubre de 1973).

date -d "Oct 21 1973" +%s 


convertir el número de segundos de nuevo a la fecha

date --date @120024000 


El comando date es bastante versátil. Otra cosa interesante que puedes hacer con la fecha (descaradamente copiada de date --help). Mostrar la hora local para el próximo viernes 09 a.m. en la costa oeste de los EE.UU.

date --date='TZ="America/Los_Angeles" 09:00 next Fri' 

Mejor aún, tomar algún tiempo para leer la página del manual http://www.manpages.info/linux/date.1.html

14

Esta es una extensión de lo que ha hecho @pellucide , pero para Macs:

para determinar el número de segundos desde época (ene 1 1970) para cualquier fecha dada (por ejemplo Oct 21 1973)

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s" 
120034800 

Tenga en cuenta que, para completar, he agregado la parte del tiempo al formato. El motivo es que date tomará la parte de fecha que le proporcionó y agregará el actual al valor proporcionado. Por ejemplo, si ejecuta el comando anterior a las 4:19 PM, sin la parte '00: 00: 00 ', agregará la hora automáticamente. Tal que "Oct 21 1973" se analizará como "21 de octubre de 1973 16:19:00". Eso puede no ser lo que quieres.

para convertir su marca de tiempo a una fecha:

$ date -j -r 120034800 
Sun Oct 21 00:00:00 PDT 1973 

página del manual de Apple para la implementación fecha: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

23

Hasta el momento, todas las respuestas usan el programa externo date.

Desde Bash 4.2, printf tiene un nuevo modificador %(dateformat)T que, cuando se utiliza con el argumento -1 da salida a la fecha actual con el formato dado por dateformat, manejado por strftime(3) (man 3 strftime de información sobre los formatos).

Así, para una solución pura Bash:

printf '%(%s)T\n' -1 

o si necesita almacenar el resultado en una variable var:

printf -v var '%(%s)T' -1 

No hay programas externos y no hay subniveles!

Desde Bash 4.3, es incluso posible no especificar el -1:

printf -v var '%(%s)T' 

(pero podría ser más prudente para dar siempre el argumento -1 no obstante).

Si usa -2 como argumento en lugar de -1, Bash utilizará la hora en que se inició el shell en lugar de la fecha actual (pero ¿por qué quiere esto?).

+4

Quiere usar' -2' en caso de que tenga un trabajo más largo en ejecución (piense en un script para controle sus copias de seguridad) y envíe un correo al final "La copia de seguridad comenzó en $ algo cuando se completó en $ ahora", lo cual se puede lograr con '-2' evitando almacenar una variable dedicada al principio. –

1

uso de este script bash (mi ~/bin/epoch):

#!/bin/bash 

# get seconds since epoch 
test "x$1" == x && date +%s && exit 0 

# or convert epoch seconds to date format (see "man date" for options) 
EPOCH="$1" 
shift 
date -d @"$EPOCH" "[email protected]" 
6

Con la mayoría de las implementaciones Awk:

awk 'BEGIN {srand(); print srand()}' 
+4

Wow que es oscuro – ericslaw

+1

Guau, tuve que ir a buscar esto. Esta es una solución pragmática, pero no necesariamente buena/portátil. [Parece que las implementaciones de awk 'srand()'] (https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html) generalmente se siembran con la fecha/hora actual. La segunda llamada a 'srand()' devuelve el valor utilizado previamente como semilla. –

Cuestiones relacionadas