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.