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


286

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


12
date +%s.%Nあなたはナノ秒を与えるでしょう、あなたはそれで働くことができますか?
Wrikken

1
@Wrikkenしかし、これは完全に移植可能ではありません。
カミロマーティン

16
date + "%Y%m%d。%H%M%S%3N"-通常、このコマンドを使用して、ミリ秒までの完全な日付と一意の時間を取得し、UNIX bashスクリプトで一時ファイル名を作成します。システムがミリ秒に対応できない場合は、それぞれ3〜6および9を使用してマイクロ秒またはナノ秒に進むことができます。
Nitin Mahesh、2016年

試してくださいdate -Ins
パーソンパーソンII 2

回答:


343

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

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

例:

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

date +%s エポックからの秒数を返します(有用な場合)。


69
%Nサポートしていないため、Mac OSでは動作しませんdate
yegor256

33
Linuxコマンドを要求する質問です。@alperの回答は、GNU coreutilsを使用した日付コマンドで正常に機能します。OSXをGNUtize:Mac OS XにGNUコマンドラインツールをインストールして使用する
caligari

77
date +%s%3Nより速い(@ michael-defortの回答に基づく)
カリガリ2014

10
OSXでは、coreutilsMacPortsまたはHomebrew の使用の一部として日付のGNUバージョンをインストールする必要がありますgdate。次に、コマンドを使用します。:この質問を参照してくださいstackoverflow.com/questions/9804966/...
Pierz

1
日付+%s%3Nの方が簡単または良いようですが、他のオフセット計算で日付を使用すると、タイムスタンプが1ミリ秒減少しました!しかし、このソリューションはオフセット計算で完璧に機能しました
Arsinux

341
  • date +"%T.%N" 現在の時刻をナノ秒で返します。

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

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

    06:47:42.773

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


32
%xN:フィールド幅に最適です。
fduff 2014年

1
日付+ "%Y%m%d。%H%M%S%3N"ミリ秒。
Nitin Mahesh、2016年

4
これは正しいものとしてマークされているものより良い答えだと思います。
kcondezo

74

ナノは10 -9およびミリ10 -3です。したがって、ナノ秒の最初の3文字を使用してミリ秒を取得できます。

date +%s%3N

からman date

%N ナノ秒(000000000..999999999)

1970-01-01 00:00:00 UTCからの%s

出典:サーバー障害の現在のUnix時間をミリ秒単位でBashで取得するにはどうすればよいですか?


@Peter Mortensenが私の投稿の1つで彼の素晴らしいアクティブな読書をしたことを誇りに思います:)
fedorqui 'SO stop harming'

46

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

brew install coreutils

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

alias date='gdate'

次に実行します

$ date +%s%N

10

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


1
これまでのところ、Xeon Phi BusyBox v1.27.0(2017-09-27 13:20:28 EDT)MicroOSで動作した1つだけが喜んで3回賛成票を投じます。
Cadoiz、

8

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))"'

2
...ただし、fork()別のプロセスを終了し、execPythonインタープリターを終了したら、ライブラリをロードするか、ライブラリを初期化して結果を書き込み、終了すると、その結果は正確ではなくなります。
Charles Duffy

4

ほとんどの場合、他の答えでおそらく十分ですが、BusyBoxシステムで問題が発生したときに2セントを追加すると思いました。

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


うわー、素晴らしい代替品!確かにあなたのコマンドは機能しますが、私にはその理由がわかりません。awkコマンドのドキュメントはどこにありますか?!どのようにしてadjtimex出力から必要な情報を抽出するための文字列を構築する方法を見つけましたか?
サトリア

素晴らしいbusyboxソリューション
コーディング

1

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;

1

次のようなPythonスクリプト:

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

3
これはミリ秒数を返しません。ミリ秒で表された秒数を返します。すべてが$ SECONDS000になります
kilianc

1
@kilianc maoyangのPythonコードはミリ秒を提供しています。
jlliagre 2016

@jlliagre:しかし、実際の時間分解能は16-17ミリ秒(1/60秒)よりも良いですか?
Peter Mortensen

はい、Python time.time()は少なくともmacOSでは浮動小数点を小数点以下6桁に返します。
porglezomp

1

私は、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'

私はこのソリューションが好きですが、ミリにもっと興味があります。私はUbuntuの中に私の.bashrcに、この機能を移植:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv

1

バージョン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()は時間をマイクロ秒の精度で返します。


0

時間とタイムゾーンで日付を表示するには

日付+ "%d-%m-%Y%T.%N%Z"

出力:2020年4月22日18:01:35.970289239 IST

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.