Come posso generare timestamp Unix?


240

La domanda correlata è "Data / ora al timestamp Unix" , ma questa domanda è più generale.

Ho bisogno dei timestamp di Unix per risolvere la mia ultima domanda. I miei interessi sono Python, Ruby e Haskell, ma altri approcci sono ben accetti.

Qual è il modo più semplice per generare timestamp Unix?


Ho creato uno strumento online qualche tempo fa. quickhash.com/timestamp
AB Carroll,

@ABCarroll Puoi spiegare come risposta come il tuo strumento online fornisce i timestamp Unix? Per favore, allegare un manuale ecc. Per questo. Sembra fornire molti dati, ma non riesco davvero a seguire l'obiettivo.
Léo Léopold Hertz 준영

gettimeofdayè il nome syscall di POSIX e Linux: stackoverflow.com/questions/11765301/… TODO: perché strace date +%dnon chiamarlo?
Ciro Santilli 7 冠状 病 六四 事件 法轮功

Se lavori e aumenti gli intervalli di tempo (ad es. Minuti, giorni, ore), di recente ho scritto uno strumento per uso personale unixtime.ninja
Guy Thouret,

Risposte:


472

In Linux o MacOS è possibile utilizzare:

date +%s

dove

  • +%s, secondi dal 1970-01-01 00:00:00 UTC. (GNU Coreutils 8.24 Manuale della data)

Esempio di output ora 1454000043.


1
Su Solaris: data di capriata 2> & 1 | grep ^ time | awk '{print $ 3}'
Mubomír Mlích il

La data BSD supporta anche +% s. Probabilmente universale, come datenormalmente definito in POSIX.2.
Dereckson,

@ ĽubomírMlích Su un host SmartOS (SunOS 5.11 joyent_20171026T003127Z), ho entrambi /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` funzionanti. In combinazione con la raccomandazione POSIX.2, penso che funzioni anche su tutti i Solaris.
Dereckson,

Nota: per aggiungere 60 secondi: date -v+60S +%sper aggiungere 1 giorno: date -v+24H +%se così via. . .
gMale

Come generare millisecondi fino a 3 cifre?
Parveen Verma,

110

in Ruby:

>> Time.now.to_i
=> 1248933648

per le rotaie puoi usare Time.zone.now.to_i. Anche se darà lo stesso valore di Time.now.to)_ima Time.zone.now.to_iè il Railsmodo.
Scambia il

In Rails, ./bin/rails runner "p Time.current.to_i"c'è un'altra soluzione.
gipcompany,

18

In Python aggiungi le seguenti righe per ottenere un timestamp:

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

17

curl icanhazepoch.com

Fondamentalmente si tratta di unix timestamps come servizio (UTaaS)


3
Heh, carino. Questo mi ha ispirato ad aggiungere una funzione simile al mio sito di hobby. curl -L -H "Accept: application/json" unixtimesta.mpti darà{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson il


8

Il comando unix 'date' è sorprendentemente versatile.

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

Prende l'output di date, che sarà nel formato definito da -f, e quindi lo stampa (-j dice di non tentare di impostare la data) nel formato +% s, secondi dall'epoca.


4
date: invalid option -- 'j'
nyuszika7h

1
Questa è un'estensione di data GNU, non nello standard Unix (POSIX).
jlliagre,

8
$ date +%s.%N

dove (GNU Coreutils 8.24 Manuale della data)

  • +%s, secondi dal 1970-01-01 00:00:00 UTC
  • +%N, nanosecondi (000000000..999999999) dall'epoca

Esempio di output ora 1454000043.704350695. Ho notato che il manuale di BSD datenon includeva spiegazioni precise sulla bandiera +%s.


Perché includi i nanosecondi di +$N? È incluso nel timestamp UNIX in alcuni sistemi?
Léo Léopold Hertz

2
Cordiali saluti, %Nnon è documentata la pagina man per data in macOS 10.13.1 (High Sierra) e non funziona. L'output di esempio ho ottenuto è: 1523342391.N.
nishanths


7

Prima di tutto, l '"epoca" di Unix o zero-time è 1970-01-01 00: 00: 00Z (che significa mezzanotte del 1 ° gennaio 1970 nel fuso orario Zulu o GMT o UTC). Un timestamp Unix è il numero di secondi da quel momento - non tenendo conto dei secondi bisestili.

Generare l'ora corrente in Perl è piuttosto semplice:

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

Generare l'ora corrispondente a un dato valore data / ora è piuttosto meno semplice. Logicamente, si utilizza la strptime()funzione da POSIX. Tuttavia, il modulo Perl POSIX :: strptime (che è separato dal modulo POSIX) ha la firma:

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

La funzione mktimenel modulo POSIX ha la firma:

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

Quindi, se conosci il formato dei tuoi dati, puoi scrivere una variante su:

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


3

a Haskell

import Data.Time.Clock.POSIX

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

in Go

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

in 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);

in Swift

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

2

In Haskell ...

Per riaverlo come tipo POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Come numero intero:

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

Proviamo JavaScript :

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

... o ancora più bello, l'approccio statico:

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

In entrambi i casi divido 1000per passare da secondi a millis e uso Math.floorsolo per rappresentare interi secondi che sono passati (vs. arrotondamento, che potrebbe arrotondare per eccesso a un intero secondo che non è ancora passato).


Questo è sbagliato. Entrambi i metodi millisecondsnon restituiscono secondi e unix timestamp è il numero di secondsquelli trascorsi dal 1 gennaio 1970 alle 00:00 UTC. Puoi usare JS, basta dividere per 1000 e arrotondare:Math.round(Date.now()/1000)
Lukas Liesis il

1
@LukasLiesis deve essere stato pre-caffè quel giorno, ho aggiornato la mia risposta anche se ho optato per Math.floorinvece di Math.round. Saluti
Madbreaks,

0

Se hai bisogno di un timestamp Unix da uno script di shell (famiglia Bourne: sh, ksh, bash, zsh, ...), questo dovrebbe funzionare su qualsiasi macchina Unix come diversamente dagli altri suggerimenti (perl, haskell, ruby, python, data GNU ), si basa su un comando e una funzione standard POSIX.

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

0

In Bash 5 c'è una nuova variabile:

echo $EPOCHSECONDS

O se vuoi una maggiore precisione (in microsecondi):

echo $EPOCHREALTIME

0

Se voglio stampare l'ora della data utc usando il comando date, devo usare l'argomento -u con il comando date.

Esempio

date -u

Produzione

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Funziona anche su vecchie versioni di Solaris e probabilmente di altri sistemi UNIX, dove '' 'data +% s' '' non è implementato
  • Non funziona su Linux e altre distribuzioni in cui gli strumenti posix sono stati sostituiti con le versioni GNU (nawk -> gawk ecc.)
  • Abbastanza poco intuitivo ma decisamente divertente :-)

-1

Con NodeJS, basta aprire un terminale e digitare:
node -e "console.log(new Date().getTime())"onode -e "console.log(Date.now())"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.