web-dev-qa-db-ja.com

ミリ秒単位で時間を取得するためのコマンド

ミリ秒単位で時間を取得するためのLinuxのシェルコマンドはありますか?

224
MOHAMED

date +%s%Nは、秒数+現在のナノ秒を返します。

したがって、echo $(($(date +%s%N)/1000000))はあなたが必要とするものです。

例:

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

date +%sは、エポック以降の秒数を返します。

291
Alper
  • date +"%T.%N"は、現在時刻をナノ秒で返します。

    06:46:41.431857000
    
  • date +"%T.%6N"は、現在の時刻を最初の6桁に丸めたナノ秒(マイクロ秒)で返します。

    06:47:07.183172
    
  • date +"%T.%3N"は、現在の時刻を最初の3桁に丸めたナノ秒(ミリ秒)で返します。

    06:47:42.773
    

一般に、dateコマンドのフォーマットの各フィールドには、オプションのフィールド幅を指定できます。

271
Michael Defort

nanoは10−9 そしてミリ10−3。したがって、ミリ秒を取得するためにナノ秒の最初の3文字を使用できます。

date +%s%3N

man dateから:

%N ナノ秒(000000000..999999999)

%s 1970-01-01 00:00:00 UTCからの経過秒数

出典:Server Fault's bashを使って現在のUnix時間をミリ秒単位で取得するにはどうすればよいですか

62
fedorqui

date%NフラグをサポートしていないOS Xでは、 homebrew を使用してcoreutilsをインストールすることをお勧めします。これにより、Linuxシステムでgdateと同じように動作するdateというコマンドにアクセスできます。

brew install coreutils

より「ネイティブな」経験のために、あなたはいつでもこれをあなたの.bash_aliasesに加えることができます

alias date='gdate'

それから実行

$ date +%s%N
37
Joshua Cook

dateコマンドはOS Xではミリ秒を提供しなかったので、pythonのエイリアスを使用しました

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

OR

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

これは、ミリ秒単位で時間を取得するための、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

これは非常に安価な操作です。Shellの内部とprocfsで動作します。

4
Bastian Bittorf

他の答えはたいていの場合はおそらく十分ですが、私はbusyboxシステムで問題に遭遇したとき私は私の2セントを追加したいと思いました。

問題のシステムは%Nフォーマットオプションをサポートしておらず、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"

また、これにはadjtimexawkが利用可能であることが必要です。そうでなければ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を使うでしょう

4
pghalliday

AIXのような変わったプラットフォーム上でさえ、Perlがこれに使用できます。例:

#!/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

@ Alperの答えに、この機能を動作させるために私がしなければならなかったことを追加したいだけでした。

Macでは、gdateを使用できるようにbrew install coreutilsが必要です。それ以外の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'と一緒に使うことができます

0
Chet

このようなpythonスクリプト:

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