Milisaniye olarak zaman alma komutu


286

Linux'ta zamanı milisaniye olarak almak için bir kabuk komutu var mı?


12
date +%s.%NSana nanosaniye verirdi, bununla çalışabilir misin?
Wrikken

1
@Wrikken Bu oldukça taşınabilir değil.
Camilo Martin

16
date + "% Y% m% d.% H% M% S% 3N" - Genel olarak bu komutu unix bash komut dosyasında geçici dosya adları oluşturmak için tam saniye ve benzersiz süreyi mili saniyeye kadar almak için kullanırım. Sisteminiz mili saniye kadar başa çıkamıyorsa, sırasıyla 3 ila 6 ve 9'u kullanarak mikro veya nano saniyeye gidebilirsiniz.
Nitin Mahesh

Deneyindate -Ins
Dr. Kişi Kişi II

Yanıtlar:


344

date +%s%N saniye sayısını + geçerli nanosaniyeyi döndürür.

Bu nedenle, echo $(($(date +%s%N)/1000000))ihtiyacınız olan şey budur.

Misal:

$ echo $(($(date +%s%N)/1000000))
1535546718115

date +%s faydalıysa, çağdan bu yana geçen saniye sayısını döndürür.


69
Mac OS'de çalışmıyor, çünkü %Ndesteklenmiyordate
yegor256

33
Soru Linux komutunu sormak. @ alper'in cevabı GNU coreutils ile tarih komutu için iyi çalışıyor . OSX'inizi GNUtize Edin: Mac OS X'te GNU Komut Satırı Araçlarını Yükleme ve Kullanma
caligari

77
date +%s%3Ndaha hızlı (@ michael-defort'un cevabına dayanarak)
caligari

10
OSX'te coreutilsMacPorts veya Homebrew kullanmanın bir parçası olarak tarihin GNU sürümünü yüklemeniz gerekir - ardından gdatekomutu kullanın. Bu soruya bakın: stackoverflow.com/questions/9804966/…
Pierz

1
Tarih +% s% 3N daha kolay veya daha iyi gibi görünse de, bunu başka bir ofset hesaplamasında kullanmak zaman damgasının 1 milisaniyede azalmasına neden oldu! Ancak bu çözüm ofset hesaplama ile mükemmel çalıştı
Arsinux

341
  • date +"%T.%N" geçerli saati nanosaniye ile döndürür.

    06:46:41.431857000
  • date +"%T.%6N" mikrosaniye olan ilk 6 basamağa yuvarlanmış nanosaniye ile geçerli saati döndürür.

    06:47:07.183172
  • date +"%T.%3N" geçerli saati, milisaniye olan ilk 3 basamağa yuvarlanmış nanosaniye ile döndürür.

    06:47:42.773

Genel olarak, datekomut formatının her alanına isteğe bağlı bir alan genişliği verilebilir.


32
%xN: alan genişliği için güzel bir tane!
fduff

1
tarih + "% Y% m% d.% H% M% S% 3N".
Nitin Mahesh

4
Sanırım bu doğru cevap olarak verilen cevaptan daha iyi bir cevap.
kcondezo

74

Nano 10 −9 ve milli 10 −3'tür . Bu nedenle, milisaniye almak için nanosaniyelerin ilk üç karakterini kullanabiliriz:

date +%s%3N

Gönderen man date:

% N nanosaniye (000000000..999999999)

1970-01-01 00:00:00 UTC'den bu yana % s saniye

Kaynak: Sunucu Arızası Bash'deki milisaniye cinsinden geçerli Unix saatini nasıl alabilirim? .


@Peter Mortensen, gönderilerimden birinde yaptığı muhteşem aktif okumalardan birini yaptığı için gurur duyuyorum :) teşekkürler !!
fedorqui 'SO

46

Bayrağı datedesteklemeyen OS X'te Homebrew kullanarak %Nyüklemenizi öneririm . Bu , Linux sistemlerinde olduğu gibi davranacak adlı bir komuta erişmenizi sağlayacaktır .coreutilsgdatedate

brew install coreutils

Daha "yerel" bir deneyim için bunu her zaman aşağıdakilere ekleyebilirsiniz .bash_aliases:

alias date='gdate'

Sonra yürütün

$ date +%s%N

10

Milisaniye içinde zaman kazanmak için Linux için bir şekilde taşınabilir bir kesmek:

#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3    # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"

millisec=$(( 10*(t2-t1) ))
echo $millisec

Çıktı:

3010

Bu, kabuk iç kısımları ve procfs ile çalışan çok ucuz bir işlemdir.


1
Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS üzerinde çalışan sadece bir tane - üç kez memnuniyetle vekalet ederdi!
Cadoiz

8

date komutu OS X'de milisaniye sağlamadı, bu yüzden python'dan bir takma ad kullanıldı

millis(){  python -c "import time; print(int(time.time()*1000))"; }

VEYA

alias millis='python -c "import time; print(int(time.time()*1000))"'

2
... ancak, fork()ayrı bir işlemi bitirdikten sonra execPython yorumcunuzu düzenledikten sonra kitaplıklarını yüklemesine / başlatmasına, sonucunu yazmasına ve çıkmasına izin verin, bu sonuç artık doğru olmayacaktır.
Charles Duffy

4

Diğer cevaplar muhtemelen çoğu durumda yeterlidir, ancak bir BusyBox sisteminde bir sorunla karşılaştığımda iki sentimi ekleyeceğimi düşündüm .

Söz konusu sistem %Nformat seçeneğini desteklemedi ve Python veya Perl yorumlayıcısı yok.

Çok kafa tırmalamadan sonra, biz (teşekkürler Dave!) Bu ile geldi:

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

adjtimex(Normalde sistem saati için seçenekleri ayarlamak için kullanılır) çıkışından saniye ve mikrosaniye ayıklar ve yeni satırlar olmadan yazdırır (böylece birlikte yapıştırılır). Mikrosaniye alanının sıfırlarla önceden doldurulması gerektiğini unutmayın, ancak bu yine de altı basamaktan uzun saniye alanını etkilemez. Bundan mikrosaniyeyi milisaniyeye dönüştürmek önemsiz olmalıdır.

Sondaki yeni bir satıra ihtiyacınız varsa (belki daha iyi göründüğü için)

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"

Ayrıca bunun gerekli olduğunu adjtimexve awkmevcut olduğunu da unutmayın . Değilse, o zaman BusyBox ile bunları yerel olarak işaret edebilirsiniz:

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

Ve sonra yukarıdaki

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Ya da elbette onları PATH

DÜZENLE:

Yukarıdaki BusyBox cihazımda çalıştı. Ubuntu'da aynı şeyi denedim ve adjtimexfarklı versiyonları olduğunu fark ettim . Ubuntu'da bu, ondalık basamaklarla saniye cinsinden süreyi mikrosaniyeye çıkarmak için çalıştı (yeni bir satır dahil)

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

Bunu Ubuntu üzerinde yapmazdım. Kullanmak istiyorumdate +%s%N


Vay, harika bir alternatif! Gerçekten emriniz işe yarıyor, ama neden olduğuna dair bir fikrim yok. Awk komutu ile ilgili belgeleri nerede bulabilirim ?! Adjtimex çıktısından istenen bilgileri çıkarmak için ipin nasıl oluşturulacağını nasıl öğrendiniz?
Satria

Müthiş
meşgul kutusu

1

Perl bunun için, hatta AIX gibi egzotik platformlarda bile kullanılabilir. Misal:

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw(gettimeofday);

my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime ($t_sec);

printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
    1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;

1

Bunun gibi bir Python betiği:

import time
cur_time = int(time.time()*1000)

3
milisaniye sayısını döndürmez, milisaniye olarak ifade edilen saniye sayısını döndürür. Herşey $ SECONDS000 olacak
kilianc

1
@kilianc maoyang'nın Python kodu milisaniye sağlıyor.
jlliagre

@jlliagre: Ancak gerçek zaman çözünürlüğü 16-17 ms'den (1/60 saniye) daha iyi mi, değil mi?
Peter Mortensen

Evet, Python's time.time()en azından macOS'ta 6 ondalık basamağa döner.
19:23, porglezomp

1

Ben sadece Alper'in cevabına bu şeyleri çalıştırmak için ne yapmam gerektiğini eklemek istedim :

Mac'te brew install coreutilskullanabilmemiz için ihtiyacınız olacak gdate. Aksi takdirde Linux'ta, sadece date. Ve bu işlev, geçici dosyalar veya herhangi bir şey oluşturmak zorunda kalmadan komutları zamanlamanıza yardımcı olacaktır:

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

Ve bir dize ile kullanabilirsiniz:

timeit 'tsc --noEmit'

Bu çözümü seviyorum ama milislerle daha çok ilgileniyorum. Ben ubuntu benim .bashrc bu işlevi taşındı:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv

1

Sürüm 4.1'den beri GNU AWK kullandığınızda, zaman kitaplığını yükleyebilir ve şunları yapabilirsiniz:

$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'

Bu işlem, 1970-01-01T00: 00: 00'dan bu yana saniye cinsinden geçerli saati, saniye altı hassasiyetle basacaktır.

the_time = gettimeofday() Süreyi 1970-01-01 UTC'den bu yana geçen süreyi kayar nokta değeri olarak saniye cinsinden döndürün. Bu platformda zaman yoksa, geri dönün -1ve ayarlayın ERRNO. Döndürülen süre ikinci saniyeden daha düşük bir hassasiyete sahip olmalıdır , ancak gerçek hassasiyet platforma göre değişebilir. gettimeofday()Bu platformda standart C sistem çağrısı mevcutsa, değeri döndürür. Aksi takdirde, MS-Windows üzerinde ise kullanmaya çalışır GetSystemTimeAsFileTime().

Kaynak: GNU awk manual

Linux sistemlerinde, standart C işlevi getimeofday()süreyi mikrosaniye hassasiyetinde döndürür.


0

Tarihi saat ve saat dilimi ile göstermek için

tarih + "% d-% m-% Y% T.% N% Z"

Çıktı: 22-04-2020 18: 01: 35.970289239 IST

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.