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.