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.
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'
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
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.
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.
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)
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 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""$@"
Respuestas:
Esto debería funcionar:
fuente
%s seconds since 1970-01-01 00:00:00 UTC
a%s seconds since the epoch, 1970-01-01 00:00:00 UTC
porque la extrañé allí.date
no está integradobash
, por lo que su versión debash
no tiene nada que ver con ladate
implementación de su sistema.date +%s.%N
date +%s%3N
Solo para agregar.
Obtenga los segundos desde la época (1 de enero de 1970) para cualquier fecha (por ejemplo, 21 de octubre de 1973).
Convertir el número de segundos a la fecha
El comando
date
es bastante versátil. Otra cosa genial que puedes hacer con la fecha (copiada descaradamente dedate --help
). Muestre la hora local para las 9AM del próximo viernes en la costa oeste de los EE. UU.Mejor aún, tómese un tiempo para leer la página de manual http://man7.org/linux/man-pages/man1/date.1.html
fuente
date
o porque estoy usandozsh
(macOS Catalina) pero esto no funciona para mí.$ date -d "Oct 21 1973" +%s
Salidas 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]
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 argumentos,-1
genera la fecha actual con el formato dado pordateformat
, manejado porstrftime(3)
(man 3 strftime
para obtener información sobre los formatos).Entonces, para una solución Bash pura:
o si necesita almacenar el resultado en una variable
var
:¡Sin programas externos ni subcapas!
Desde Bash 4.3, incluso es posible no especificar lo siguiente
-1
:(pero podría ser más sabio siempre dar 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 usar para calcular los tiempos transcurridosfuente
-2
en 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-2
evitando almacenar un variable dedicada al principio.Solución pura de bash
Desde
bash
5.0 ( lanzado el 7 de enero de 2019 ) puede usar la variable incorporadaEPOCHSECONDS
.También hay
EPOCHREALTIME
que incluye fracciones de segundos.EPOCHREALTIME
se puede convertir a microsegundos (μs) eliminando el punto decimal. Esto puede ser de interés cuando se utilizabash
la aritmética integrada(( expression ))
que solo puede manejar enteros.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.
fuente
date +%s%3N
) puede usarecho $(( ${EPOCHREALTIME/./} / 1000 ))
Con la mayoría de las implementaciones de Awk:
fuente
srand()
generalmente se siembran con la fecha / hora actual. La segunda llamada asrand()
devuelve el valor utilizado previamente como semilla.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)
Tenga en cuenta que, para completar, he agregado la parte de tiempo al formato. La razón es que
date
tomará 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:
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
fuente
date
comando de BSD , mientras que cualquier solución que sugieradate -d
es para GNUdate
. La fecha de BSD en macOS proviene de FreeBSD y comparte varias opciones con NetBSD y OpenBSD. Y esto está completamente separado de bash.%N
opció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 lastrftime(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.use este script bash (my
~/bin/epoch
):fuente