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?

Léo Léopold Hertz 준영
źródło
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.

Naresh
źródło
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
nocleg ze śniadaniem.
źródło
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
Steven Kryskalla
źródło
17

curl icanhazepoch.com

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

Chata 8
źródło
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
12

W Perlu:

>> time
=> 1335552733
davidchambers
źródło
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.

Alan Horn
źródło
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.

Masi
źródło
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
Na macOS jest gdatew Homebrew apple.stackexchange.com/a/135749/181223
phil pirozhkov
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"'
Jonathan Leffler
źródło
4

Dla kompletności PHP:

php -r 'echo time();'

W BASH:

clitime=$(php -r 'echo time();')
echo $clitime
Mike Mackintosh
źródło
1
dla bash mamy już datepolecenie, więc nie sądzę, aby trzeba było wywoływać php stamtąd.
fedorqui „SO przestań krzywdzić”
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
ZagNut
źródło
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
Tom Morris
źródło
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;
        }
    }
Rúben Jerónimo
źródło
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).

Madbreaks
źródło
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()}'
jlliagre
źródło
0

W Bash 5 jest nowa zmienna:

echo $EPOCHSECONDS

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

echo $EPOCHREALTIME
Colera Su
źródło
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
Viraj Wadate
źródło
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 :-)
pez
źródło
-1

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

Dusan Jovanov
źródło