Obtenga el tiempo actual en segundos desde Epoch en Linux, Bash

634

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
fuente
22
Lo siento, debo decir esto ... '' La fecha no parece ofrecer esa opción. ¿Hay alguna manera fácil? '' - lea el manual nuevamente ;-)
TheBonsai el
77
Algunas versiones de date lo tienen y otras no. Entonces no siempre está presente. Ejecuté 'type -a date' y usé una versión diferente y funcionó.
Scott Rowley
1
FWIW, Ubuntu solo tiene / bin / date, para lo cual la respuesta de @ Steef funciona
Jonathan Hartley
1
@TheBonsai que no es parte de la versión estándar POSIX de la herramienta 'fecha'. Solo porque su versión lo tiene (probablemente GNU), no debe asumir que las implementaciones de todos lo hacen.
Wyatt8740

Respuestas:

1160

Esto debería funcionar:

date +%s
Steef
fuente
45
la fecha manpge debería cambiarse de %s seconds since 1970-01-01 00:00:00 UTCa %s seconds since the epoch, 1970-01-01 00:00:00 UTCporque la extrañé allí.
Devin
3
No funciona para mi la fecha del hombre no muestra% s. ¿Debo tener una versión muy antigua de bash (3.2.51 (1) para Solaris)?
livefree75
77
@ livefree75 dateno está integrado bash, por lo que su versión de bashno tiene nada que ver con la dateimplementación de su sistema.
Adrian Frühwirth
11
Y si desea las fracciones de un segundo, a nueve decimales, use:date +%s.%N
Jonathan Hartley
19
Para uso en milisegundosdate +%s%3N
Juan Campa
133

Solo para agregar.

Obtenga los segundos desde la é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 a la fecha

date --date @120024000


El comando datees bastante versátil. Otra cosa genial que puedes hacer con la fecha (copiada descaradamente de date --help). Muestre la hora local para las 9AM del próximo viernes en la costa oeste de los EE. UU.

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

Mejor aún, tómese un tiempo para leer la página de manual http://man7.org/linux/man-pages/man1/date.1.html

pelucida
fuente
Esta no es la pregunta del OP, pero responde a la mía, así que +1 de mi parte.
AnthonyD973
Tal vez es la versión de dateo porque estoy usando zsh(macOS Catalina) pero esto no funciona para mí. $ date -d "Oct 21 1973" +%sSalidas en ejecuciónusage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter el
43

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

Desde Bash 4.2, printftiene un nuevo modificador %(dateformat)Tque, cuando se usa con argumentos, -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 lo siguiente -1:

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

(pero podría ser más sabio siempre dar 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 usar 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
fuente
99
Desea usar -2en caso de que tenga un trabajo de ejecución más prolongado (piense en un script para controlar sus copias de seguridad) y envíe un correo al final "La copia de seguridad comenzó en $ somewhen completado en $ now", que se puede lograr -2evitando almacenar un variable dedicada al principio.
Sebastian J.
24

Solución pura de bash

Desde bash5.0 ( lanzado el 7 de enero de 2019 ) puede usar la variable incorporada EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

También hay EPOCHREALTIMEque incluye fracciones de segundos.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIMEse puede convertir a microsegundos (μs) eliminando el punto decimal. Esto puede ser de interés cuando se utiliza bashla aritmética integrada (( expression ))que solo puede manejar enteros.

$ echo ${EPOCHREALTIME/./}
1547624774371215

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
fuente
Para una resolución de milisegundos (el mismo formato que date +%s%3N) puede usarecho $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212
23

Con la mayoría de las implementaciones de Awk:

awk 'BEGIN {srand(); print srand()}'
Steven Penny
fuente
21
Vaya que es oscura
ericslaw
8
Wow, tuve que ir a buscar este. Esta es una solución pragmática, pero no necesariamente buena / portátil. Parece que las implementaciones de awksrand() generalmente se siembran con la fecha / hora actual. La segunda llamada a srand()devuelve el valor utilizado previamente como semilla.
Ryan Ransford
19

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

Para determinar el número de segundos desde la época (1 de enero de 1970) para una fecha determinada (por ejemplo, 21 de octubre de 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 de tiempo al formato. La razón es que datetomará cualquier parte de la fecha que le diste y agregará el actual hora 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. De modo que "21 de octubre de 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 de manual de Apple para la implementación de la fecha: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html

PeqNP
fuente
1
Para ser claros, esto es para el datecomando de BSD , mientras que cualquier solución que sugiera date -des para GNU date. La fecha de BSD en macOS proviene de FreeBSD y comparte varias opciones con NetBSD y OpenBSD. Y esto está completamente separado de bash.
ghoti
la %Nopción mencionada por segundos fraccionarios en la fecha gnu falta en la fecha de MacOS. El 10.14, ninguno de los formatos está en la página del manual; están en la strftime(3)página man, que no tendrá si no tiene Xcode instalado, y puede que no vea con el comando man incluso si lo tiene.
Dan Pritts
1

use este script bash (my ~/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" "$@"
comonad
fuente