現在のUnix時間をミリ秒(つまり、1970年1月1日のUnixエポックからのミリ秒数)で取得するにはどうすればよいですか?
_date +%s
_
エポック以降の秒の数を返します。
_date +%s%N
_
秒と現在のナノ秒を返します。
_date +%s%N | cut -b1-13
_
エポック以降のミリ秒数を示します-現在の秒数とナノ秒の左3つ。
そして MikeyB -echo $(($(date +%s%N)/1000000))
から(1000で割るとマイクロ秒になります)
単に%3N
ナノ秒を上位3桁に切り捨てます(これはミリ秒になります)。
$ date +%s%3N
1397392146866
これは機能します私の Kubunt 12.04(Precise Pangolin)で。
ただし、%N
は、ターゲットシステムによっては実装されない場合があります。例えば。組み込みシステムでテストされました(buildroot rootfs、非HFを使用してコンパイルされたARMクロスツールチェーン))%N
:
$ date +%s%3N
1397392146%3N
(また、私の(非ルート)Androidタブレットには%N
。)
_date +%N
_はOS Xでは機能しませんが、次のいずれかを使用できます
Ruby -e 'puts Time.now.to_f'
_python -c 'import time; print time.time()'
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
_date +%s000
_私の解決策は最高ではありませんが、私にとってはうまくいきました:
date +%s000
2012-05-05のような日付をミリ秒に変換する必要があるだけです。
これを捨てるだけですが、除算の正しい式は次のようになると思います。
echo $(($(date +%s%N)/1000000))
取得するために外部プログラムを実行することを提案する人々のために ミリ秒...そのレートで、あなたもこれを行うかもしれません:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
ポイント:ここから回答を選ぶ前に、すべてのプログラムが1秒未満で実行されるわけではないことに注意してください。測定!
このソリューションはmacOSで動作します。
Bashスクリプトの使用を検討していて、Pythonを使用できる場合は、次のコードを使用できます。
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
スクリプトが実行された時間の長さを表示する方法を探している場合、以下は(完全に正確ではない)結果を提供します。
スクリプトの最初のできるだけ近くに、次のように入力します
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ボックスが手元にありません。
これは、除算を実行せずにミリ秒単位で時間を取得する方法です。多分それはより高速です...
# 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
は、時間の特別な値です。
受け入れられた回答に革命的なものを追加するのではなく、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
Dateとexprを使用すると、そこに到達できます。
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
展開して、好きなことをしてください
私はこれがエポックからミリ秒を与えないことを理解していますが、それはまだいくつかのケースの答えとして役立つかもしれません、それはあなたが本当にそれを必要とするものに依存し、ミリ秒の数値が必要な場合は1000を掛けます:D
最も簡単な方法は、小さな実行可能ファイルを(C f.ex.から)作成し、それをスクリプトで使用できるようにすることです。
以前の応答をすべてまとめると、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"
}
(以前の回答からの繰り返し)date +%N
はOS Xでは機能しませんが、次のものも使用できます。
Perl(Time :: Formatモジュールが必要)。多分それは [〜#〜] cpan [〜#〜] 使用するのに最適なモジュールではないかもしれませんが、それは仕事を成し遂げます。 Time :: Formatは通常、ディストリビューションで利用可能です。
Perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
単純なシェル経過計算が必要な場合、これは簡単で移植性があり、 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
Alpine Linux (多くのDockerイメージ)および場合によっては他の最小限のLinux環境では、adjtimex
を乱用することができます。
adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3
adjtimex
は、カーネル時間変数の読み取り(および設定)に使用されます。 awk
を使用するとマイクロ秒を取得でき、head
を使用すると最初の3桁のみを使用できます。
このコマンドの信頼性はわかりません。
注: この答え から恥知らずに盗まれた