Wie kann ich Unix-Zeitstempel generieren?

240

Die verwandte Frage lautet "Datetime To Unix-Zeitstempel" , diese Frage ist jedoch allgemeiner.

Ich benötige Unix-Zeitstempel, um meine letzte Frage zu lösen . Meine Interessen sind Python, Ruby und Haskell, aber andere Ansätze sind willkommen.

Was ist der einfachste Weg, um Unix-Zeitstempel zu generieren?

Léo Léopold Hertz 준영
quelle
Ich habe vor einiger Zeit ein Online-Tool erstellt. quickhash.com/timestamp
AB Carroll
@ABCarroll Können Sie bitte als Antwort erklären, wie Ihr Online-Tool Unix-Zeitstempel bereitstellt? Bitte fügen Sie dazu ein Handbuch usw. bei. Es scheint eine Menge Daten zu liefern, aber ich kann nicht wirklich verfolgen, was das Ziel ist.
Léo Léopold Hertz 준영
gettimeofdayist der POSIX- und Linux- Systemrufname : stackoverflow.com/questions/11765301/… TODO: Warum strace date +%dnicht anrufen?
Ciro Santilli 法轮功 冠状 病 六四 事件 7
Wenn Sie mit Zeitbereichen
Guy Thouret

Antworten:

472

Unter Linux oder MacOS können Sie Folgendes verwenden:

date +%s

wo

  • +%s, Sekunden seit 1970-01-01 00:00:00 UTC. (GNU Coreutils 8.24 Datumshandbuch)

Beispielausgabe jetzt 1454000043.

Naresh
quelle
1
Unter Solaris: Fachwerkdatum 2> & 1 | grep ^ time | awk '{print $ 3}'
Ľubomír Mlích
BSD-Datum unterstützt auch +% s. Wahrscheinlich universell, wie datenormalerweise in POSIX.2 definiert.
Dereckson
@ ĽubomírMlích Auf einem SmartOS-Host (SunOS 5.11 joyent_20171026T003127Z) arbeiten beide /usr/bin/date +%s and / usr / xpg4 / bin / date +% s`. In Kombination mit der POSIX.2-Empfehlung funktioniert dies meiner Meinung nach auch unter allen Solaris.
Dereckson
Hinweis: 60 Sekunden date -v+60S +%shinzufügen: 1 Tag hinzufügen: date -v+24H +%sund so weiter. . .
gMale
Wie generiere ich Millisekunden bis zu nur drei Ziffern?
Parveen Verma
110

in Ruby:

>> Time.now.to_i
=> 1248933648
bb.
quelle
für Schienen können Sie verwenden Time.zone.now.to_i. Es wird zwar das gleiche O / P geben wie Time.now.to)_iaber Time.zone.now.to_iist der RailsWeg.
Swaps
In Rails ./bin/rails runner "p Time.current.to_i"ist eine andere Lösung.
gipcompany
18

Fügen Sie in Python die folgenden Zeilen hinzu, um einen Zeitstempel zu erhalten:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993
Steven Kryskalla
quelle
17

curl icanhazepoch.com

Grundsätzlich handelt es sich um Unix-Zeitstempel als Service (UTaaS)

Hut8
quelle
3
Heh, schön. Dies hat mich dazu inspiriert, meiner Hobby-Site eine ähnliche Funktion hinzuzufügen. curl -L -H "Accept: application/json" unixtimesta.mpwird Ihnen geben{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson
12

In Perl:

>> time
=> 1335552733
Davidkammern
quelle
8

Der Unix-Befehl 'Datum' ist überraschend vielseitig.

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

Nimmt die Ausgabe von date, die in dem durch -f definierten Format vorliegt, und druckt sie dann in der Form +% s, Sekunden seit der Epoche, aus (-j sagt, versuchen Sie nicht, das Datum festzulegen).

Alan Horn
quelle
4
date: invalid option -- 'j'
Nyuszika7h
1
Dies ist eine GNU-Datumserweiterung, nicht im Unix-Standard (POSIX).
Jlliagre
8
$ date +%s.%N

wo (GNU Coreutils 8.24 Datumshandbuch)

  • +%s, Sekunden seit 1970-01-01 00:00:00 UTC
  • +%N, Nanosekunden (000000000..999999999) seit der Epoche

Beispielausgabe jetzt 1454000043.704350695. Ich bemerkte, dass das BSD-Handbuch von datekeine genaue Erklärung über die Flagge enthielt +%s.

Masi
quelle
Warum schließen Sie Nanosekunden ein +$N? Ist es in einigen Systemen im UNIX-Zeitstempel enthalten?
Léo Léopold Hertz 29
2
Zu %NIhrer Information, die Manpage für das Datum in macOS 10.13.1 (High Sierra) ist nicht dokumentiert und funktioniert nicht. Die Beispielausgabe, die ich erhalten habe, ist : 1523342391.N.
Nishanths
Unter macOS gibt es gdatein Homebrew apple.stackexchange.com/a/135749/181223
phil pirozhkov
7

Zuallererst ist die Unix-Epoche oder Nullzeit 1970-01-01 00: 00: 00Z (dh Mitternacht des 1. Januar 1970 in der Zeitzone Zulu oder GMT oder UTC). Ein Unix-Zeitstempel ist die Anzahl der Sekunden seit dieser Zeit - ohne Berücksichtigung von Schaltsekunden.

Das Generieren der aktuellen Zeit in Perl ist ziemlich einfach:

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

Das Generieren der Zeit, die einem bestimmten Datums- / Zeitwert entspricht, ist weniger einfach. Logischerweise verwenden Sie die strptime()Funktion von POSIX. Das Perl POSIX :: strptime-Modul (das vom POSIX-Modul getrennt ist) hat jedoch die folgende Signatur:

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

Die Funktion mktimeim POSIX-Modul hat die Signatur:

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

Wenn Sie also das Format Ihrer Daten kennen, können Sie eine Variante schreiben über:

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

Der Vollständigkeit halber PHP:

php -r 'echo time();'

In BASH:

clitime=$(php -r 'echo time();')
echo $clitime
Mike Mackintosh
quelle
1
Für Bash haben wir bereits den dateBefehl, daher denke ich nicht, dass es notwendig ist, PHP von dort aus aufzurufen.
Fedorqui 'SO hör auf,'
3

in 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
ZagNut
quelle
2

In Haskell ...

So geben Sie es als POSIXTime-Typ zurück:

import Data.Time.Clock.POSIX
getPOSIXTime

Als Ganzzahl:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime
Tom Morris
quelle
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
quelle
2

Versuchen wir es mit JavaScript :

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

... oder noch schöner, der statische Ansatz:

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

In beiden Fällen dividiere ich durch 1000, um von Sekunden auf Millis zu wechseln, und ich verwende Math.floornur ganze Sekunden, die vergangen sind ( im Vergleich zur Rundung, die auf eine ganze Sekunde aufrunden kann , die noch nicht vergangen ist).

Madbreaks
quelle
Das ist falsch. Beide Methoden geben millisecondskeine Sekunden zurück und der Unix-Zeitstempel ist die Anzahl der secondsseit dem 1. Januar 1970 00:00 UTC verstrichenen. Sie können JS verwenden, teilen Sie einfach durch 1000 und runden Sie:Math.round(Date.now()/1000)
Lukas Liesis
1
@LukasLiesis muss an diesem Tag vor dem Kaffee gewesen sein. Ich habe meine Antwort aktualisiert, obwohl ich mich Math.floorstattdessen für entschieden habe Math.round. Prost
Madbreaks
0

Wenn Sie einen Unix-Zeitstempel aus einem Shell-Skript benötigen (Bourne-Familie: sh, ksh, bash, zsh, ...), sollte dies auf jedem Unix-Computer funktionieren, anders als bei den anderen Vorschlägen (Perl, Haskell, Ruby, Python, GNU-Datum) ) basiert es auf einem POSIX-Standardbefehl und einer POSIX-Standardfunktion.

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

In Bash 5 gibt es eine neue Variable:

echo $EPOCHSECONDS

Oder wenn Sie eine höhere Genauigkeit (in Mikrosekunden) wünschen:

echo $EPOCHREALTIME
Colera Su
quelle
0

Wenn ich utc date time mit dem Befehl date drucken möchte, muss ich das Argument -u mit dem Befehl date verwenden.

Beispiel

date -u

Ausgabe

Fri Jun 14 09:00:42 UTC 2019
Viraj Wadate
quelle
0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Funktioniert sogar auf alten Versionen von Solaris und wahrscheinlich anderen UNIX-Systemen, auf denen '' 'date +% s' '' nicht implementiert ist
  • Funktioniert nicht unter Linux und anderen Distributionen, in denen die Posix-Tools durch die GNU-Versionen ersetzt wurden (nawk -> gawk usw.)
  • Ziemlich unintuitiv, aber auf jeden Fall amüsant :-)
pez
quelle
-1

Öffnen Sie mit NodeJS einfach ein Terminal und geben Sie Folgendes ein:
node -e "console.log(new Date().getTime())"odernode -e "console.log(Date.now())"

Dusan Jovanov
quelle