bashで現在のUnix時間をミリ秒単位で取得する方法は?


232

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

回答:


265

この:

date +%s 

エポックからの数を返します。

この:

date +%s%N

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

そう:

date +%s%N | cut -b1-13

エポックからのミリ秒数、つまり現在の秒とナノ秒の左の3つを示します。


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


39
カットが何ミリ秒追加されるのだろうか:
カイルブラント

13
または、追加プロセスの高額なオーバーヘッドを回避して、シェルですべてを実行したい場合(実際、%+ s + Nの桁数が変更された場合の問題を回避しています):echo $(($(date +%s%N)/1000))
MikeyB

5
それが問題の原則です...マジックナンバーを避け、実際にあなたが意味するものをコーディングしてください。
MikeyB

25
男性がLinuxではなくUnixを要求し、現在のトップアンサー(日付+%s%N)が私のAIXシステムで機能しないことに注意する価値があると思います。
ピート

12
@Pete +1 OS XとFreeBSDで同じ
ocodo

100

%3Nナノ秒を最上位3桁(ミリ秒)に切り捨てるために単に使用できます。

$ date +%s%3N
1397392146866

これは、たとえばkubuntu 12.04で機能します。

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

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

(また、私の(ルート化されていない%N)Androidタブレットにはない)。


1
@warren:私はあなたが編集し、変更されたことを見1397392146%3N1397392146%N、しかしの出力は1397392146%3N、私は本当に私のAndroidタブレットのbusyboxのコンソール上で見たいものをということです。編集について説明してください。
ジョー

歴史からのウォーレンのコメントは「3から6に変更されたため、3はマイクロ秒にしかならない」。彼の編集は完全に偽のようです。ロールバックする必要があります。
ブクゾール

1
これは特にGNU coreutilsの機能です。最終的に、これはgnulibのgithub.com/gagern/gnulib/blob/…に実装されています。
-telotortium

おそらくそこにあるドットは理にかなっています。date +%s.%3N印刷し1510718281.134ます。
ダークスカイ

これは受け入れられた答えでなければなりません。
ノア・サスマン

61

date +%N OS Xでは動作しませんが、次のいずれかを使用できます

  • ルビー: ruby -e 'puts Time.now.to_f'
  • python: python -c 'import time; print time.time()'
  • node.js: node -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

1
完全のためにnode -e 'console.log(Date.now())'
...-slf

1
PHPの使用:php -r 'echo microtime(TRUE);'
TachyonVortex

8
もちろん、これらの通訳がウォームアップするのを待つ必要があります。これは、あまりにも、動作しますwget -qO- http://www.timeapi.org/utc/now?\\s.\\N
カミロ・マーティン

8
または、実際にミリ秒を必要せず、正しい形式のみが必要な場合:date +%s000
レナーホイト

1
apple.stackexchange.com/questions/135742/…には、OSXでBrewを介してこれを行うための指示がありますcoreutils
同じ

10

これをそこに投げるだけですが、除算の正しい式は次のようになります

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

10

私のソリューションは最高ではありませんが、私にとってはうまくいきました。

date +%s000

2012-05-05のような日付をミリ秒に変換する必要がありました。


1
素晴らしいハック、笑:)
k06a

7
あなたは私の同僚の誰かでなければなりません。
ナキロン

7

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

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

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


ローカルシステムに時間を尋ねているわけではありません。それは質問に暗示されていると思います。ネットワーク接続にも依存しています。
-orkoden

2
@orkodenこの質問は、「1970年1月1日のUNIXエポックからのミリ秒数」を明示的に要求します。また、時間を取得するためだけにRubyやPython(またはwget)全体を起動するべきではない方法を指摘します-これは高速チャネルを介して行われるか、ミリ秒は関係ありません。
カミロマーティン

2
はい、悪い解決策の欠陥を強調するために悪い解決策を提供していることを理解しました。いくつかの解決策を試し、時間を測定しました。lpaste.net/119499結果はちょっと面白いです。非常に高速なi7マシンでも、date実行に3ミリ秒かかります。
-orkoden

@orkoden素敵なテスト!OS これは、プロセス生成オーバーヘッドに関係している可能性があります。
カミロマーティン

1
@Nakilonであり、これが、あらゆるプロダクションのようなカール可能な便利さに頼るべきではない理由です。
カミロマーティン

4

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

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

#!/bin/bash

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

なぜ反対票?
フランクトーニグ

特に正当化されていないようです。下矢印のヒントには「この答えは役に立たない」と書かれていますが、IMOは役立ちます。代わりに、Pythonスクリプトにすることを望んでいたのかもしれません。それはより単純で、bashコマンドとしてもうまく機能します。
アンドリューシュルマン

ダウン票についてはあまり心配しないでください(私のものではありませんでした)...特に匿名の場合(そこから何が間違っているように見えますか?)。ちょっと待って、それを処理します...ここでさらに+1が行われます...何を推測します:あなたは今「投票」することもできますよね?
Pierre.Vriens

ダウンボートは、システムの問題が原因で発生したようです。その後、再びシステムによって削除されました。
マイケルハンプトン

2

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

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

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あなたがしたいことをするように強制するかなりまれな設定です。さらにたくさんあります!

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


3
または単に使用することができますtime <script>
ウォーレン14

2

除算を行わずにミリ秒単位で時間を取得する方法を次に示します。たぶんもっと速い...

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

更新:でのみ動作する純粋なbashの別の代替 bash 4.2+上記と同じですがprintf、日付の取得に使用されます。メインプロセスから分岐するプロセスがないため、確実に高速になります。

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

別の漁獲量はここにかかわらず、あなたのことですstrftime実装がサポートしなければならない%s%Nされ、私のテストマシン上のケースではありません。man strftimeサポートされているオプションを参照してください。構文も参照man bashしてくださいprintf-1および-2は、時間の特別な値です。


strftime(3)がサポートしていないように思える%Nので、printfナノ秒を印刷する方法はありません。Ubuntu 14.04を使用しています。
haridsv

@haridsv、ええ、glibcにはありません。dateより信頼性の高いオプションのようです。
アコスタディノフ

2

取得できる最も正確なタイムスタンプ(少なくとも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`"

echoコマンドのコメントを外すと、どのように機能するかを確認できます。

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

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

1

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

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

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

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

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


date複数回実行する潜在的な問題があります。場合によっては、コマンドの作成時に日付と時刻が実行ごとに変わる場合があります。date一度実行してパーツを解析し、計算を実行する方が適切です。それをするいくつかの方法の1つはそうでしょうt=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x"。質問にはbashというタグが付けられているため、これはBash構文を使用します。ほのめかしているように、あなたの答え(および私のバリエーション)は、エポック以降ではなく、ミリ秒単位ではなく、現在までの秒数を示しています。
デニスウィリアムソン

1

(上記の繰り返し)date +%NはOS Xでは動作しませんが、以下も使用できます:

Perl(Time :: Formatモジュールが必要)。おそらく、使用するのに最適なCPANモジュールではありませんが、仕事は完了します。Time :: Formatは通常、ディストリビューションで利用可能になります。

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

OPは、特にbashを使用してそれを行う方法を求めました。他の何かを起動する方法として保存するこのbashはどうですか?
MadHatter

OSXのbashシェルスクリプトでこれを使用します。したがって、date使用することはできず、ニーズに応えるbash専用コマンドはありません。
TVNshack

けっこうだ。回答の一部として OSXをdate使用できない理由を明確にしたい場合は、ダウン票を削除します。
MadHatter

これは上記のいくつかの回答で説明されました。提案されたリストにはないコマンドをコメントとして追加できませんでした。ここに追加しました。
-TVNshack

結構、これはキヤノンへの有用な追加であると認めます。私から+1!
マッドハッター

1

OSXの場合、以前の応答をすべてまとめる

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"
}

0

単純なシェル経過計算が必要な場合は、上記の答えを使用して、これは簡単で移植可能です。

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

alpine linux(多くのdockerイメージ)およびその他の最小限のlinux環境の場合、悪用できますadjtimex

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

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

このコマンドがどれほど信頼できるかはわかりません。

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

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