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?


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.


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

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

17

curl icanhazepoch.com

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


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


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).


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.


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"'

4

Der Vollständigkeit halber PHP:

php -r 'echo time();'

In BASH:

clitime=$(php -r 'echo time();')
echo $clitime

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

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

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

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).


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()}'

0

In Bash 5 gibt es eine neue Variable:

echo $EPOCHSECONDS

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

echo $EPOCHREALTIME

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

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 :-)

-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())"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.