Unix zaman damgalarını nasıl oluşturabilirim?


240

İlgili soru "Unix zaman damgası için Datetime" , ancak bu soru daha geneldir.

Son sorumu çözmek için Unix zaman damgalarına ihtiyacım var . İlgi alanlarım Python, Ruby ve Haskell, ancak başka yaklaşımlar da hoş karşılanıyor.

Unix zaman damgalarını oluşturmanın en kolay yolu nedir?


Bir süre önce çevrimiçi bir araç yaptım. quickhash.com/timestamp
AB Carroll

@ABCarroll Lütfen çevrimiçi aracınızın Unix zaman damgalarını nasıl sağladığını açıklayabilir misiniz? Lütfen bunun için bir el kitabı vb. Ekleyin. Çok fazla veri sağlıyor gibi görünüyor ama hedefin ne olduğunu gerçekten takip edemiyorum.
Léo Léopold Hertz 준영

gettimeofdayve Linux sistem adı nedir: stackoverflow.com/questions/11765301/… YAPILACAKLAR: neden strace date +%daramıyorsunuz?
Ciro Santilli 法轮功 at 病 六四 事件 法轮功

Zaman aralığıyla (örneğin dakikalar, günler, saatler) çalışıyorsanız ve arttıkça,
Guy Thouret

Yanıtlar:


472

Linux veya MacOS'ta şunları kullanabilirsiniz:

date +%s

nerede

  • +%s, 1970-01-01 00:00:00 UTC'den beri saniye. (GNU Coreutils 8.24 Tarih kılavuzu)

Şimdi örnek çıktı 1454000043.


1
Solaris'te: makas tarihi 2> & 1 | grep ^ zaman | awk '{print $ 3}'
Mubomír Mlích

BSD tarihi +% s değerini de destekler. datePOSIX.2'de normal olarak tanımlandığı gibi muhtemelen evrenseldir .
Dereckson

@ OmubomírMlích SmartOS ana bilgisayarında (SunOS 5.11 joyent_20171026T003127Z), hem /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` çalışıyorum. POSIX.2 önerisiyle birlikte, bunun tüm Solarislerde de çalıştığını düşünüyorum.
Dereckson

Not: 60 saniye date -v+60S +%seklemek için: 1 gün eklemek için: date -v+24H +%svb. . .
gMale

Sadece 3 basamağa kadar milisaniye nasıl oluşturulur?
Parveen Verma

110

Ruby'de:

>> Time.now.to_i
=> 1248933648

Raylar için kullanabilirsiniz Time.zone.now.to_i. O aynı o / p vereceğiz rağmen Time.now.to)_iancak Time.zone.now.to_ibir Railsyol.
Swap

Rails, ./bin/rails runner "p Time.current.to_i"başka bir çözümdür.
gipcompany

18

Python'da zaman damgası almak için aşağıdaki satırları ekleyin:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993

17

curl icanhazepoch.com

Temelde bir hizmet olarak unix zaman damgaları (UTaaS)


3
Heh, güzel. Bu, hobi siteme benzer bir özellik eklememe ilham verdi. curl -L -H "Accept: application/json" unixtimesta.mpverecek{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Craig Anderson


8

Unix 'date' komutu şaşırtıcı derecede çok yönlüdür.

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

date-F ile tanımlanan biçimde olacak çıktıyı alır ve sonra yazdırır (-j tarihi ayarlamaya çalışmaz diyor) +% s, çağdan bu yana saniye cinsinden.


4
date: invalid option -- 'j'
nyuszika7h

1
Bu, Unix standardında (POSIX) değil, bir GNU tarih uzantısıdır.
jlliagre

8
$ date +%s.%N

nerede (GNU Coreutils 8.24 Tarih kılavuzu)

  • +%s, 1970-01-01 00:00:00 UTC'den beri saniye
  • +%N, çağdan beri nanosaniye (000000000..999999999)

Şimdi örnek çıktı 1454000043.704350695. BSD kılavuzunun datebayrak hakkında kesin açıklama içermediğini fark ettim +%s.


Neden nanosaniye ekliyorsunuz +$N? Bazı sistemlerde UNIX zaman damgasında yer alıyor mu?
Léo Léopold Hertz 준영

2
FYI, %NmacOS 10.13.1'de (High Sierra) tarih sayfası için belgelenmemiştir ve çalışmaz. Bende örnek çıktı: 1523342391.N.
nishanths

MacOS üzerinde var gdateHomebrew içinde apple.stackexchange.com/a/135749/181223
Phil Pirozhkov

7

Her şeyden önce, Unix 'dönemi' veya sıfır zamanı 1970-01-01 00: 00: 00Z'dir (Zulu veya GMT veya UTC saat diliminde 1 Ocak 1970'in gece yarısı anlamına gelir). Unix zaman damgası, o zamandan bu yana geçen saniye sayısıdır - artık saniye olarak hesaplanmaz.

Perl'de şu anki saati oluşturmak oldukça kolay:

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

Belirli bir tarih / saat değerine karşılık gelen zamanı oluşturmak daha az kolaydır. Mantıksal olarak, strptime()POSIX işlevini kullanırsınız . Ancak Perl POSIX :: strptime modülünün (POSIX modülünden ayrı) imzası vardır:

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

mktimePOSIX modülündeki işlevin imzası vardır:

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

Dolayısıyla, verilerinizin biçimini biliyorsanız, aşağıdakilere bir değişken yazabilirsiniz:

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


3

içinde Haskell

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

içinde Go

import "time"
t := time.Unix()

içerisinde 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);

içinde Swift

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970

2

Haskell'de ...

POSIXTime türü olarak geri almak için:

import Data.Time.Clock.POSIX
getPOSIXTime

Tamsayı olarak:

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

JavaScript'i deneyelim :

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

... hatta daha da iyisi, statik yaklaşım:

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

Her iki durumda 1000da saniyeden milisele gitmek için bölüyorum ve Math.floorsadece geçen tüm saniyeleri temsil etmek için kullanıyorum (yuvarlamaya karşı, henüz geçmemiş bir saniyeye yuvarlanabilir).


Bu yanlış. Her iki yöntem millisecondsde saniye döndürmez ve unix zaman damgası, seconds1 Ocak 1970 00:00 UTC'den bu yana geçenlerin sayısıdır . Math.round(Date.now()/1000)
JS'yi

1
@LukasLiesis o gün önceden kahve içmiş olmalıydım, Math.floorbunun yerine seçimimi yapmama rağmen cevabımı güncelledim Math.round. Şerefe
Madbreaks

0

Bir kabuk komut dosyasından (Bourne ailesi: sh, ksh, bash, zsh, ...) bir Unix zaman damgasına ihtiyacınız varsa, bu, diğer önerilerin (perl, haskell, ruby, python, GNU tarihi) aksine herhangi bir Unix makinesinde çalışmalıdır. ), bir POSIX standart komutuna ve özelliğine dayanır.

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

0

Bash 5'te yeni bir değişken var:

echo $EPOCHSECONDS

Veya daha yüksek hassasiyet istiyorsanız (mikrosaniye cinsinden):

echo $EPOCHREALTIME

0

Utc tarih saatini date komutunu kullanarak yazdırmak istersem date komutuyla -u argümanını kullanmam gerekir.

Misal

date -u

Çıktı

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Solaris'in ve muhtemelen `` tarih +% s '' '' nin uygulanmadığı diğer UNIX sistemlerinin eski sürümlerinde bile çalışır
  • Linux ve posix araçlarının GNU sürümleriyle değiştirildiği diğer dağıtımlarda çalışmaz (nawk -> gawk vb.)
  • Oldukça unintuitive ama definitelly eğlenceli :-)

-1

NodeJS ile bir terminal açın ve şunu yazın:
node -e "console.log(new Date().getTime())"veyanode -e "console.log(Date.now())"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.