web-dev-qa-db-ja.com

Bashで現在のUnix時間をミリ秒で取得するにはどうすればよいですか?

現在のUnix時間をミリ秒(つまり、1970年1月1日のUnixエポックからのミリ秒数)で取得するにはどうすればよいですか?

253
Richard

この:

_date +%s 
_

エポック以降のの数を返します。

この:

_date +%s%N
_

秒と現在のナノ秒を返します。

そう:

_date +%s%N | cut -b1-13
_

エポック以降のミリ秒数を示します-現在の秒数とナノ秒の左3つ。


そして MikeyB -echo $(($(date +%s%N)/1000000))から(1000で割るとマイクロ秒になります)

283
warren

単に%3Nナノ秒を上位3桁に切り捨てます(これはミリ秒になります)。

$ date +%s%3N
1397392146866

これは機能します私の Kubunt 12.04(Precise Pangolin)で。

ただし、%Nは、ターゲットシステムによっては実装されない場合があります。例えば。組み込みシステムでテストされました(buildroot rootfs、非HFを使用してコンパイルされたARMクロスツールチェーン))%N

$ date +%s%3N
1397392146%3N

(また、私の(非ルート)Androidタブレットには%N。)

111
Joe

_date +%N_はOS Xでは機能しませんが、次のいずれかを使用できます

  • Ruby :_Ruby -e 'puts Time.now.to_f'_
  • Pythonpython -c 'import time; print time.time()'
  • Node.jsnode -e 'console.log(Date.now())'
  • [〜#〜] php [〜#〜]php -r 'echo microtime(TRUE);'
  • エリクサーDateTime.utc_now() |> DateTime.to_unix(:millisecond)
  • インターネット:_wget -qO- http://www.timeapi.org/utc/now?\\s.\\N_
  • またはミリ秒の間、最も近い秒に丸められます_date +%s000_
67
Lri

私の解決策は最高ではありませんが、私にとってはうまくいきました:

date +%s000

2012-05-05のような日付をミリ秒に変換する必要があるだけです。

11
Pablo

これを捨てるだけですが、除算の正しい式は次のようになると思います。

echo $(($(date +%s%N)/1000000))
10
WillB

取得するために外部プログラムを実行することを提案する人々のために ミリ秒...そのレートで、あなたもこれを行うかもしれません:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

ポイント:ここから回答を選ぶ前に、すべてのプログラムが1秒未満で実行されるわけではないことに注意してください。測定!

7
Camilo Martin

このソリューションはmacOSで動作します。

Bashスクリプトの使用を検討していて、Pythonを使用できる場合は、次のコードを使用できます。

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'
7
Frank Thonig

スクリプトが実行された時間の長さを表示する方法を探している場合、以下は(完全に正確ではない)結果を提供します。

スクリプトの最初のできるだけ近くに、次のように入力します

basetime=$(date +%s%N)

これにより、1361802943996000000のような開始値が得られます。

スクリプトの最後に、次を使用します

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

のようなものが表示されます

runtime: 12.383 seconds

ノート:

(1 * 10 ^ 09)必要に応じて1000000000に置き換えることができます

"scale=3"bcを強制して必要な操作を行う、かなりまれな設定です。もっとたくさんあります!

私はこれをWindows 7/MinGWでのみテストしました...適切な* nixボックスが手元にありません。

3
user161733

これは、除算を実行せずにミリ秒単位で時間を取得する方法です。多分それはより高速です...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

更新:Bash 4.2以降でのみ機能する純粋なBashの別の代替方法は上記と同じですが、printfを使用して日付を取得します。メインプロセスから分岐されたプロセスがないため、確実に高速になります。

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

ただし、ここでのもう1つの問題は、strftime実装が%sおよび%Nをサポートする必要があることです。これはnotテストマシンの場合です。サポートされているオプションについては、man strftimeをご覧ください。 printf構文については、man bashも参照してください。 -1および-2は、時間の特別な値です。

2
akostadinov

受け入れられた回答に革命的なものを追加するのではなく、Bashを初めて使用するユーザーが簡単に再利用できるようにするためです。この例は、OS Xおよび古いBashで動作することに注意してください。

nowInMs() {
  echo "$(($(date +'%s * 1000 + %-N / 1000000')))"
}

これで実行できます

TIMESTAMP="$(nowInMs)";

取得できる最も正確なタイムスタンプ(少なくともMac OS Xの場合)はおそらくこれです。

python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'

1490665305.021699

ただし、実行には約30ミリ秒かかることに注意してください。それを2桁の小数部に切り取り、最初に時間の読み取りの平均オーバーヘッドを計算してから、測定値から削除できます。次に例を示します。

function getTimestamp {
  echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13` 
}
function getDiff {
  echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do 
  #echo -n $i 
  a=`getTimestamp`
  #echo -n "   $a"
  b=`echo "$a-$prev_a" | bc`
  prev_a=$a
  #echo "  diff=$b"
  acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"

エコーコマンドのコメントを外して、それがどのように機能するかを確認できます。

このスクリプトの結果は通常、次の3つの結果のいずれかです。

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
2
ishahak

Dateとexprを使用すると、そこに到達できます。

X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X

展開して、好きなことをしてください

私はこれがエポックからミリ秒を与えないことを理解していますが、それはまだいくつかのケースの答えとして役立つかもしれません、それはあなたが本当にそれを必要とするものに依存し、ミリ秒の数値が必要な場合は1000を掛けます:D

最も簡単な方法は、小さな実行可能ファイルを(C f.ex.から)作成し、それをスクリプトで使用できるようにすることです。

1
Johan Andersson

以前の応答をすべてまとめると、OS Xでは

ProductName:    Mac OS X
ProductVersion:    10.11.6
BuildVersion:    15G31+

あなたは好きにできます

microtime() {
    python -c 'import time; print time.time()'
}
compute() {
    local START=$(microtime)
    #$1 is command $2 are args
    local END=$(microtime)
    DIFF=$(echo "$END - $START" | bc)
    echo "$1\t$2\t$DIFF"
}
1
loretoparisi

(以前の回答からの繰り返し)date +%NはOS Xでは機能しませんが、次のものも使用できます。

Perl(Time :: Formatモジュールが必要)。多分それは [〜#〜] cpan [〜#〜] 使用するのに最適なモジュールではないかもしれませんが、それは仕事を成し遂げます。 Time :: Formatは通常、ディストリビューションで利用可能です。

Perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
1
TVNshack

単純なシェル経過計算が必要な場合、これは簡単で移植性があり、 Frank Thonigの答え を使用します。

now() {
    python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514
0
Bill Cheswick

Alpine Linux (多くのDockerイメージ)および場合によっては他の最小限のLinux環境では、adjtimexを乱用することができます。

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

adjtimexは、カーネル時間変数の読み取り(および設定)に使用されます。 awkを使用するとマイクロ秒を取得でき、headを使用すると最初の3桁のみを使用できます。

このコマンドの信頼性はわかりません。

注: この答え から恥知らずに盗まれた

0
Qw3ry