端末のエポックからのミリ秒単位の時間


42

OSXターミナルでエポックからの時間をミリ秒単位で取得するにはどうすればよいですか?

Linux / Ubuntuに相当するものはdate +%s.%N次のとおりです。

Linux $ date +%s.%N
1403377762.035521859

私のOSX端末では機能しません:

OSX $ date +%s.%N
1403377800.N

回答:


48

dateOS X のプログラムは、GNUのcoreutils dateプログラムとは異なります。coreutils(gnu-dateを含む)をインストールするdateと、ミリ秒をサポートするバージョンができます。

ソースからのインストールはネイティブOS Xユーザーにとっては面倒な場合があるため、Homebrewを使用することをお勧めします。

Homebrewを使用してこれらのツールをインストールするには、ターミナルでこのonelinerを実行します。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewがインストールされました(インストール後にインストーラーの提案に従うことが賢明です)。次に、を使用してcoreutilsをインストールしbrewます。

brew install coreutils

インストールが言うように、すべてのコマンドは接頭辞「g」でインストールされています(gdate、gcat、glnなど)。これらのコマンドを通常の名前で本当に使用する必要がある場合は、次のように「gnubin」ディレクトリをPATH(~/.bash_profile)に追加できます。

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

これで実行できます

gdate +%s.%N

これにより、エポック以降の時間がミリ秒単位で出力されます。


3
いいね にgdateインストールされたパスを追加する必要さえありませんでした/usr/local/bin/gdate
アダムマタン14年

それはあなたが期待することです。すべてのバイナリは、gプレフィックスでインストールされます。私が提供したパスでは、すべて同じgnu-coreutilsにgプレフィックスがありません。したがって、PATH = "/ usr / local / opt / coreutils / libexec / gnubin:$ PATH"のようにパスに追加すると、元のファイルが置き換えられます。だから、OS Xは、dateGNUなりdate(代わりにgdateの)
CousinCocaine

それがうまくいったことは結構です。
いとこコカイン14年

3
技術的には、+%s.%N形式はミリ秒ではなくナノ秒の精度まで秒を与えます。brewを使用してインストールした後gdate、マンページをチェックして、ミリ秒が使用可能かどうかを確認しました。そうではありません。また、の精度を%N指定できるとは言わなかったが、とにかく試した。秒をミリ秒の精度のみ(つまり、小数点以下3桁)まで下げるコマンドはであることがわかりましたgdate +%s.%3N
LS

10

OS Xでは、date +%sOS Xがdate出力でこれ以上の精度をサポートしておらず、内部表現でサポートされていない余分な精度はマイナス無限大に向かって切り捨てられるため、実行するだけです。

ミリ秒単位の出力が必要な場合は、次のコマンドを使用できますが、前述の理由により精度を追加するのではなく、ゼロを追加するだけで出力が修正されます。以下は、必要な精度をサポートするシステムで正しいミリ秒を出力します。

echo $(($(date +'%s * 1000 + %-N / 1000000')))

上記のコマンドのソース:Unix.SE – Unixエポックからのミリ秒の取得方法

OS Xで正しい数のゼロを追加するコマンドが必要な場合は、次を使用できます。

date +%s000

OS Xはをサポートしていないため%-N、何もしません(シェル変数$Nが設定されている場合は問題が発生する可能性があります)。使用するだけですdate +%s000(またはdate +%s.000、小数点が必要な場合)。
ゴードンデイヴィソン14年

@Gordonはい、私はこれについて言及しましたが、OPがその精度が可能なシステムで正常に動作するポータブルソリューションを探している場合、上記のコマンドは動作します。もちろん、単に出力にゼロを追加することもできますが、余分な精度をサポートする他のシステムにゼロをコピーすることは理想的ではありません。
grg

ああ、なるほど。ただし、OS Xのdateコマンドは%-Nをそのまま通過するためN、計算に干渉する可能性があります。設定N=7000000000000000000を試してから、コマンドを試してみてください...これは実際にはめったにないケースですが、環境に依存しないものの方が安全だと思います。
ゴードンデイヴィソン14年

@Gordon確かに、変数を設定すると壊れてしまいます。コマンドを実行する直前に特定の変数をリセットできると思いますが、とにかくコマンドを実行する前に、そのような変数をリセットするのは良いスクリプトです。もちろん、これは、OPがスクリプトを必要としているという私の仮定に基づいています。編集済みの回答には、ゼロのリテラル追加が含まれます。
grg

2
OPは「エポックからの時間(ミリ秒単位)」を要求しました。これは、文字列にゼロを追加する方法に関する回答です。同じではありません。投稿で説明されていますが、質問への回答ではありません。
いとこコカイン14年

6

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

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

#!/bin/bash

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

または、pythonスクリプトを直接記述します。

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

Perlはどこにでもあります。

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.