Jak mogę wygenerować uniksowe znaczniki czasu?


240

Powiązane pytanie to „Datetime To Unix timestamp” , ale to pytanie jest bardziej ogólne.

Potrzebuję uniksowych znaczników czasu, aby rozwiązać moje ostatnie pytanie. Moje zainteresowania to Python, Ruby i Haskell, ale inne podejścia są mile widziane.

Jaki jest najłatwiejszy sposób na wygenerowanie uniksowych znaczników czasu?


Jakiś czas temu stworzyłem narzędzie online. quickhash.com/timestamp
AB Carroll

@ABCarroll Czy możesz wyjaśnić jako odpowiedź, w jaki sposób twoje narzędzie online zapewnia uniksowe znaczniki czasu? Załącz do tego instrukcję itp. Wydaje się, że dostarcza dużo danych, ale tak naprawdę nie mogę śledzić, co jest celem.
Léo Léopold Hertz

gettimeofdayjest nazwa wywołania systemowego POSIX i Linux: stackoverflow.com/questions/11765301/... TODO: dlaczego strace date +%dnie zadzwonić?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jeśli pracujesz z przedziałami czasowymi (np. Minutami
Guy Thouret

Odpowiedzi:


472

W systemie Linux lub MacOS możesz użyć:

date +%s

gdzie

  • +%s, sekundy od 1970-01-01 00:00:00 UTC. (Podręcznik GNU Coreutils 8.24)

Przykładowy wynik teraz 1454000043.


1
W systemie Solaris: data kratownicy 2> i 1 | grep ^ time | awk '{print $ 3}'
Ľubomír Mlích

Data BSD obsługuje również +% s. Prawdopodobnie uniwersalny, jak datezwykle jest zdefiniowany w POSIX.2.
Dereckson,

@ ĽubomírMlích Na hoście SmartOS (SunOS 5.11 joyent_20171026T003127Z) pracuję /usr/bin/date +%s and / usr / xpg4 / bin / date +% s`. W połączeniu z zaleceniem POSIX.2 myślę, że działa to również na wszystkich systemach Solaris.
Dereckson,

Uwaga: aby dodać 60 sekund: date -v+60S +%saby dodać 1 dzień: date -v+24H +%si tak dalej. . .
gMale

Jak generować milisekundy do 3 cyfr tylko?
Parveen Verma,

110

w Ruby:

>> Time.now.to_i
=> 1248933648

do szyn można użyć Time.zone.now.to_i. Chociaż da to to samo o / p, Time.now.to)_iale Time.zone.now.to_ijest na to Railssposób.
Zamiana

In Rails ./bin/rails runner "p Time.current.to_i"to inne rozwiązanie.
gipcompany

18

W pythonie dodaj następujące wiersze, aby uzyskać znacznik czasu:

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

17

curl icanhazepoch.com

Zasadniczo są to uniksowe znaczniki czasu jako usługa (UTaaS)


3
Hej, miło. Zainspirowało mnie to do dodania podobnej funkcji do mojej witryny hobby. curl -L -H "Accept: application/json" unixtimesta.mpda ci{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson


8

Polecenie uniksowe „data” jest zaskakująco wszechstronne.

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

Pobiera dane wyjściowe date, które będą w formacie zdefiniowanym przez -f, a następnie drukuje je (-j mówi, nie próbuj ustawiać daty) w postaci +% s, sekund od epoki.


4
date: invalid option -- 'j'
nyuszika7h

1
To rozszerzenie daty GNU, nie w standardzie Unix (POSIX).
jlliagre

8
$ date +%s.%N

gdzie (GNU Coreutils 8.24 Data manual)

  • +%s, sekundy od 1970-01-01 00:00:00 UTC
  • +%N, nanosekundy (000000000..999999999) od epoki

Przykładowy wynik teraz 1454000043.704350695. Zauważyłem, że instrukcja BSD datenie zawiera dokładnego wyjaśnienia flagi +%s.


Dlaczego podajesz nanosekundy +$N? Czy jest on zawarty w sygnaturze czasowej UNIX w niektórych systemach?
Léo Léopold Hertz -

2
Do twojej wiadomości, %Nnie jest udokumentowana strona podręcznika dla daty w macOS 10.13.1 (High Sierra) i nie działa. Wyjście próbki mam to: 1523342391.N.
nishanths


7

Przede wszystkim uniksowa „epoka” lub zero to 1970-01-01 00: 00: 00Z (co oznacza północ 1 stycznia 1970 r. W strefie czasowej Zulu, GMT lub UTC). Uniksowy znacznik czasu to liczba sekund od tego czasu - nie uwzględniająca sekund przestępnych.

Generowanie bieżącego czasu w Perlu jest raczej łatwe:

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

Generowanie czasu odpowiadającego danej wartości daty / godziny jest raczej mniej łatwe. Logicznie używasz strptime()funkcji z POSIX. Jednak moduł Perl POSIX :: strptime (który jest niezależny od modułu POSIX) ma podpis:

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

Funkcja mktimew module POSIX ma sygnaturę:

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

Tak więc, jeśli znasz format swoich danych, możesz napisać wariant na:

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


3

w Haskell

import Data.Time.Clock.POSIX

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

w Go

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

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

w Swift

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

2

W Haskell ...

Aby odzyskać jako POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Jako liczba całkowita:

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

Spróbujmy JavaScript :

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

... lub jeszcze ładniejsze, podejście statyczne:

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

W obu przypadkach 1000dzielę przez, aby przejść od sekund do milisów i używam Math.floortylko do reprezentowania pełnych sekund, które minęły (w porównaniu do zaokrąglania, które mogą zaokrąglać w górę do pełnej sekundy, która jeszcze nie minęła).


To jest źle. Obie metody millisecondsnie zwracają sekund, a uniksowy znacznik czasu to liczba, secondsktóra upłynęła od 1 stycznia 1970 r. 00:00 UTC. Możesz użyć JS, po prostu podziel przez 1000 i zaokrąglij:Math.round(Date.now()/1000)
Lukas Liesis

1
@LukasLiesis musiał być tego dnia przed kawą, zaktualizowałem swoją odpowiedź, chociaż zdecydowałem się na Math.floorzamiast Math.round. Na zdrowie
Madbreaks

0

Jeśli potrzebujesz znacznika czasu Unix ze skryptu powłoki (rodzina Bourne: sh, ksh, bash, zsh, ...), powinno to działać na dowolnej maszynie uniksowej, w przeciwieństwie do innych sugestii (perl, haskell, ruby, python, data GNU ), jest oparty na standardowej komendzie i funkcji POSIX.

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

0

W Bash 5 jest nowa zmienna:

echo $EPOCHSECONDS

Lub jeśli chcesz wyższą precyzję (w mikrosekundach):

echo $EPOCHREALTIME

0

Jeśli chcę wydrukować datę i godzinę utc za pomocą polecenia date, muszę użyć argumentu -u z poleceniem date.

Przykład

date -u

Wynik

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Działa nawet na starych wersjach Solaris i prawdopodobnie na innych systemach UNIX, w których data +% s nie jest zaimplementowana
  • Nie działa w systemie Linux i innych dystrybucjach, w których narzędzia posix zostały zastąpione wersjami GNU (nawk -> gawk itp.)
  • Całkiem nieintuicyjne, ale zdecydowanie zabawne :-)

-1

W NodeJS wystarczy otworzyć terminal i wpisać:
node -e "console.log(new Date().getTime())"lubnode -e "console.log(Date.now())"

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.