¿Cómo puedo generar marcas de tiempo Unix?


240

La pregunta relacionada es "Fecha y hora para la marca de tiempo de Unix" , pero esta pregunta es más general.

Necesito marcas de tiempo de Unix para resolver mi última pregunta. Mis intereses son Python, Ruby y Haskell, pero otros enfoques son bienvenidos.

¿Cuál es la forma más fácil de generar marcas de tiempo Unix?


Hice una herramienta en línea hace algún tiempo. quickhash.com/timestamp
AB Carroll

@ABCarroll ¿Puede explicarme de manera anónima cómo su herramienta en línea proporciona marcas de tiempo de Unix? Por favor, adjunte un manual, etc. para ello. Parece proporcionar una gran cantidad de datos, pero realmente no puedo seguir cuál es el objetivo.
Léo Léopold Hertz 준영

gettimeofdayes el nombre de la llamada al sistema POSIX y Linux: stackoverflow.com/questions/11765301/… TODO: ¿por qué strace date +%dno llamarlo?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Si trabaja e incrementa los rangos de tiempo (por ejemplo, minutos, días, horas), escribí una herramienta para mi propio uso recientemente unixtime.ninja
Guy Thouret el

Respuestas:


472

En Linux o MacOS puedes usar:

date +%s

dónde

  • +%s, segundos desde 1970-01-01 00:00:00 UTC. (GNU Coreutils 8.24 Manual de fecha)

Salida de ejemplo ahora 1454000043.


1
En Solaris: fecha de armadura 2> & 1 | grep ^ tiempo | awk '{print $ 3}'
Ľubomír Mlích

La fecha BSD también admite +% s. Probablemente universal, como datese define normalmente en POSIX.2.
Dereckson el

@ ĽubomírMlích En un host SmartOS (SunOS 5.11 joyent_20171026T003127Z), tengo ambos /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` trabajando. En combinación con la recomendación POSIX.2, creo que esto también funciona en todos los Solaris.
Dereckson el

Nota: para agregar 60 segundos: date -v+60S +%spara agregar 1 día: date -v+24H +%sy así sucesivamente. . .
gMale

¿Cómo generar milisegundos hasta 3 dígitos solamente?
Parveen Verma

110

en Ruby:

>> Time.now.to_i
=> 1248933648

para rieles que puedes usar Time.zone.now.to_i. Aunque dará la misma o / p que Time.now.to)_ipero Time.zone.now.to_ies el Railscamino.
Swaps

En Rails, ./bin/rails runner "p Time.current.to_i"es otra solución.
gipcompany

18

En python agregue las siguientes líneas para obtener una marca de tiempo:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993

17

curl icanhazepoch.com

Básicamente son las marcas de tiempo de Unix como servicio (UTaaS)


3
Je, bien. Esto me inspiró a agregar una característica similar a mi sitio de hobby. curl -L -H "Accept: application/json" unixtimesta.mpte dará{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson


8

El comando 'date' de Unix es sorprendentemente versátil.

fecha -j -f "% a% b% d% T% Z% Y" "` fecha` "" +% s "

Toma la salida de date, que estará en el formato definido por -f, y luego la imprime (-j dice que no intente establecer la fecha) en la forma +% s, segundos desde la época.


44
date: invalid option -- 'j'
nyuszika7h

1
Esa es una extensión de fecha GNU, no en el estándar Unix (POSIX).
jlliagre

8
$ date +%s.%N

donde (GNU Coreutils 8.24 Fecha manual)

  • +%s, segundos desde 1970-01-01 00:00:00 UTC
  • +%N, nanosegundos (000000000..999999999) desde la época

Ejemplo de salida ahora 1454000043.704350695. Me di cuenta de que el manual de BSD dateno incluía una explicación precisa sobre la bandera +%s.


¿Por qué incluyen nanosegundos por +$N? ¿Está incluido en la marca de tiempo UNIX en algunos sistemas?
Léo Léopold Hertz 준영

2
Para su información, %Nno se documenta la página de manual para la fecha en macOS 10.13.1 (High Sierra) y no funciona. El resultado de ejemplo que tengo es: 1523342391.N.
nishanths


7

En primer lugar, la 'época' o tiempo cero de Unix es 1970-01-01 00: 00: 00Z (es decir, la medianoche del 1 de enero de 1970 en la zona horaria Zulu o GMT o UTC). Una marca de tiempo Unix es el número de segundos desde ese momento, sin tener en cuenta los segundos bisiestos.

Generar la hora actual en Perl es bastante fácil:

perl -e 'print time, "\n"'

Generar el tiempo correspondiente a un valor de fecha / hora dado es bastante menos fácil. Lógicamente, utiliza la strptime()función de POSIX. Sin embargo, el módulo Perl POSIX :: strptime (que es independiente del módulo POSIX) tiene la firma:

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = 
                                     POSIX::strptime("string", "Format");

La función mktimeen el módulo POSIX tiene la firma:

mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)

Entonces, si conoce el formato de sus datos, podría escribir una variante en:

perl -MPOSIX -MPOSIX::strptime -e \
    'print mktime(POSIX::strptime("2009-07-30 04:30", "%Y-%m-%d %H:%M")), "\n"'


3

en Haskell

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

en Go

import "time"
t := time.Unix()

en C

time(); // in time.h POSIX

// for Windows time.h
#define UNIXTIME(result)   time_t localtime; time(&localtime); struct tm* utctime = gmtime(&localtime); result = mktime(utctime);

en Swift

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970

2

En Haskell ...

Para recuperarlo como un tipo POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Como un entero:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime

2
public static Int32 GetTimeStamp()
    {
        try
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            return 0;
        }
    }

2

Probemos JavaScript :

var t = Math.floor((new Date().getTime()) / 1000);

... o incluso mejor, el enfoque estático:

var t = Math.floor(Date.now() / 1000);

En ambos casos, divido entre 1000para pasar de segundos a milis y utilizo Math.floorpara representar solo segundos enteros que han pasado (vs. redondeo, que puede redondear a un segundo entero que aún no ha pasado).


Esto está mal. Ambos métodos millisecondsno devuelven segundos y la marca de tiempo de Unix es el número secondsque ha transcurrido desde el 1 de enero de 1970 a las 00:00 UTC. Puede usar JS, solo divida entre 1000 y redondee:Math.round(Date.now()/1000)
Lukas Liesis

1
@LukasLiesis debe haber sido pre-café ese día, he actualizado mi respuesta aunque opté por en Math.floorlugar de Math.round. Saludos
Madbreaks

0

Si necesita una marca de tiempo Unix de un script de shell (familia Bourne: sh, ksh, bash, zsh, ...), esto debería funcionar en cualquier máquina Unix a diferencia de las otras sugerencias (perl, haskell, ruby, python, fecha GNU ), se basa en un comando y característica estándar POSIX.

PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'

0

En Bash 5 hay una nueva variable:

echo $EPOCHSECONDS

O si desea una mayor precisión (en microsegundos):

echo $EPOCHREALTIME

0

Si quiero imprimir utc date time usando el comando date necesito usar el argumento -u con el comando date.

Ejemplo

date -u

Salida

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Funciona incluso en versiones antiguas de Solaris y probablemente en otros sistemas UNIX, donde '' 'date +% s' '' no está implementado
  • No funciona en Linux y otras distribuciones donde las herramientas posix han sido reemplazadas por las versiones GNU (nawk -> gawk, etc.)
  • Bastante poco intuitivo pero definitivamente divertido :-)

-1

Con NodeJS, simplemente abra una terminal y escriba:
node -e "console.log(new Date().getTime())"onode -e "console.log(Date.now())"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.