Linuxにミリ秒単位の時間を取得するシェルコマンドはありますか?
date -Ins
Linuxにミリ秒単位の時間を取得するシェルコマンドはありますか?
date -Ins
回答:
date +%s%N
秒数+現在のナノ秒を返します。
したがって、echo $(($(date +%s%N)/1000000))
必要なものです。
例:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
エポックからの秒数を返します(有用な場合)。
%N
サポートしていないため、Mac OSでは動作しませんdate
date +%s%3N
より速い(@ michael-defortの回答に基づく)
coreutils
MacPortsまたはHomebrew の使用の一部として日付のGNUバージョンをインストールする必要がありますgdate
。次に、コマンドを使用します。:この質問を参照してくださいstackoverflow.com/questions/9804966/...
date +"%T.%N"
現在の時刻をナノ秒で返します。
06:46:41.431857000
date +"%T.%6N"
マイクロ秒である最初の6桁に丸められたナノ秒で現在の時刻を返します。
06:47:07.183172
date +"%T.%3N"
ミリ秒である最初の3桁に丸められたナノ秒で現在の時刻を返します。
06:47:42.773
一般に、date
コマンドのフォーマットのすべてのフィールドには、オプションのフィールド幅を指定できます。
%xN
:フィールド幅に最適です。
ナノは10 -9およびミリ10 -3です。したがって、ナノ秒の最初の3文字を使用してミリ秒を取得できます。
date +%s%3N
からman date
:
%N ナノ秒(000000000..999999999)
1970-01-01 00:00:00 UTCからの%s秒
出典:サーバー障害の現在のUnix時間をミリ秒単位でBashで取得するにはどうすればよいですか?。
これは、ミリ秒単位の時間を取得するためのLinuxのなんらかの方法で移植可能なハックです。
#!/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
出力は次のとおりです。
3010
これは非常に安価な操作で、シェルの内部とprocfsで動作します。
date
コマンドはOS Xでミリ秒を提供しなかったため、Pythonのエイリアスを使用しました
millis(){ python -c "import time; print(int(time.time()*1000))"; }
または
alias millis='python -c "import time; print(int(time.time()*1000))"'
fork()
別のプロセスを終了し、exec
Pythonインタープリターを終了したら、ライブラリをロードするか、ライブラリを初期化して結果を書き込み、終了すると、その結果は正確ではなくなります。
ほとんどの場合、他の答えでおそらく十分ですが、BusyBoxシステムで問題が発生したときに2セントを追加すると思いました。
問題のシステムは%N
formatオプションをサポートしておらず、PythonまたはPerlインタープリターがありません。
頭をひっかいた後、私たちは(Daveに感謝!)これを思いつきました:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
の出力から秒とマイクロ秒を抽出します adjtimex
(通常はシステムクロックのオプションを設定するために使用される)のそれらを新しい行なしで出力します(そのため、それらは結合されます)。マイクロ秒フィールドにはゼロを事前に埋め込む必要がありますが、これはいずれにしても6桁より長い秒フィールドには影響しません。これから、マイクロ秒をミリ秒に変換することは簡単です。
末尾の新しい行が必要な場合(おそらく見栄えが良いため)、
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
また、これが必要でadjtimex
ありawk
、使用可能であることにも注意してください。そうでない場合は、BusyBoxを使用して、ローカルで次のように指定できます。
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
そして、上記を次のように呼び出します
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
またはもちろん、あなたはそれらをあなたの中に置くことができます PATH
編集:
上記は私のBusyBoxデバイスで動作しました。Ubuntuでも同じことを試しましたが、adjtimex
バージョンが異なることに気付きました。Ubuntuでは、これは秒単位で時間を小数点以下をマイクロ秒に出力するように機能しました(末尾の新しい行を含む)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Ubuntuではこれを行いません。私は使うだろうdate +%s%N
Perlは、AIXのようなエキゾチックなプラットフォームでも使用できます。例:
#!/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;
次のようなPythonスクリプト:
import time
cur_time = int(time.time()*1000)
time.time()
は少なくともmacOSでは浮動小数点を小数点以下6桁に返します。
私は、Alperの答えに、これを機能させるために私がしなければならなかったことを追加したかっただけです。
Macではが必要brew install coreutils
になるため、を使用できますgdate
。それ以外のLinuxでは、それだけdate
です。そしてこの関数は、一時ファイルなどを作成することなくコマンドの時間を計るのに役立ちます:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
そして、あなたはそれを文字列で使うことができます:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
バージョン4.1以降のGNU AWKを使用する場合、timeライブラリをロードして次の操作を実行できます。
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
これにより、1970-01-01T00:00:00からの現在時刻が秒単位で秒単位で印刷されます。
the_time = gettimeofday()
1970-01-01 UTCからの経過時間を秒単位で浮動小数点値として返します。このプラットフォームで時間が利用できない場合は、を返し-1
て設定しERRNO
ます。返される時間は1秒未満の精度である必要がありますが、実際の精度はプラットフォームによって異なる場合があります。gettimeofday()
このプラットフォームで標準のC システムコールが利用可能な場合は、単に値を返します。それ以外の場合、MS-Windowsの場合はを使用しようとしますGetSystemTimeAsFileTime()
。出典:GNU awkマニュアル
Linuxシステムでは、標準のC関数getimeofday()
は時間をマイクロ秒の精度で返します。
date +%s.%N
あなたはナノ秒を与えるでしょう、あなたはそれで働くことができますか?