Pythonで現在の時間をミリ秒単位で取得しますか?


532

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


67
import time; ms = time.time()*1000.0
samplebias

4
@samplebias:一部のプラットフォームやpythonバージョンtime.time()よりも精度が低くなる可能性がありdatetime.utcnow()ます。
jfs 2015年

5
いつからミリ秒単位ですか?あなたはエポック(深夜1970年1月1日UTC)以降を意味する場合は、これを参照してください。stackoverflow.com/questions/18169099/...
マイケルScheper

2
真のマイクロ秒解像度のミリ秒のタイムスタンプについては、こちらをご覧ください:stackoverflow.com/questions/38319606/…–
ガブリエルステープルズ

回答:


710

私が必要なものについて、上記の@samplebiasのコメントに基づいて、私がやったことは次のとおりです:

import time
millis = int(round(time.time() * 1000))
print millis

クイックイージー。おかげで、おならをお詫び申し上げます。

再利用の場合:

import time

current_milli_time = lambda: int(round(time.time() * 1000))

次に:

>>> current_milli_time()
1378761833768

34
これは正しい答えを与えないかもしれません。ドキュメントによれば、「時間は常に浮動小数点数として返されますが、すべてのシステムが1秒よりも精度の高い時間を提供するわけではないことに注意してください」
Jason Polites

11
なぜ必要なのroundでしょうか。そうですint(time.time() * 1000)十分ですか?
Maxim Vladimirsky

14
IMO私は床ではなく床を使用しますが、それは私だけです。誰かが時間が何であるかを尋ね、そしてそれは午前7時32分だ場合、彼らはおそらく先の番号は、8 7ではありません
davr

1
@ParallelUniverse:Windows上の最近のCPythonで.utcnow()使用GetSystemTimeAsFileTime()します。ないでしょうtime.clock()(呼び出しQueryPerformanceCounter()よりノイズそれは減らすかもしれないより紹介)?精度は精度と同じではないを参照してください。
jfs 2015

10
@MaximVladimirskyこれはint()の動作ではありません。Intは値をフロアリングせず、ゼロに向かって丸めます。正の数では同じですが、負の数では逆になります。:INT(1.5)は、INT(-1.5)は-1与えるmath.floor(-1.5)が得られる-2参照を、1を与えるdocs.python.org/2/library/stdtypes.html
スキップハフマン

91

time.time()秒にのみ解像度を与える可能性がありdatetimeます。ミリ秒の推奨アプローチはです。

from datetime import datetime
dt = datetime.now()
dt.microsecond

94
それほど有用ではありません-これは、DTの秒のマイクロ秒のみを提供します。stackoverflow.com/a/1905423/74632を
Boris Chervenkov

8
+1は、これがシステムから信頼できるタイムスタンプを取得する公式の方法であるためです。
Pascal

16
-1。これはこの質問に対する不正解です。@Borisがコメントしたように、これは「マイクロ秒単位の時間」を与えません。例えば、マイクロ秒数での日、時間、秒は含まれません。
2015

3
+1これは正しい値を提供し、算術は数学のため機能すると想定できます。ユーザーがミリ秒/マイクロ秒単位の現在の時刻を必要とする場合、単純な計算でそこに到達します。タイムデルタが必要な場合(これは要求されません)、再び、算術演算によって1日が節約されます。
Jack Stout

3
タイムスタンプ全体ではなく、現在時刻のマイクロ秒を示します。
kawadhiya21

48
def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 

3
あなたがのために式インライン可能性が.total_seconds()生成するために(おそらく)より良い精度を:(td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3(真の部門で有効)それとも、ミリ秒を切り捨てるしたい場合は、次に使用// 10**3
jfs 2015年

1
これは、datetimeを使用する場合の最良の答えのようです
dlsso

35

バージョン3.7を使用できtime.time_ns()エポックから渡されたナノ秒と時間を取得します。だからできる

ms = time.time_ns() // 1000000 

ミリ秒単位の時間を整数として取得します。


これは私にとって最も効果的でした(Python 3.7.6)
Paul Watson


13

別の解決策は、独自のutils.pyに埋め込むことができる関数です

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))

12

datetimeでミリ秒を返す単純なメソッドがコードに必要な場合:

from datetime import datetime
from datetime import timedelta

start_time = datetime.now()

# returns the elapsed milliseconds since the start of the program
def millis():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms

これはミリ秒単位の2つの時間の差であり、@ Jasonの回答とメソッドを組み合わせるとミリ秒単位の現在のタイムスタンプが得られます...考えてみると、UNIXタイムスタンプはstart_time= datetime(1970,1,1)
PRを使用した

現地時間はあいまいで単調ではない可能性があります(DST遷移またはローカルutcオフセットを変更するその他の理由による)。.utcnow()代わりに使用するか、絶対時間を必要としない場合は、を使用できますtime.monotonous()。注:真の除算を有効にしsome_int + dt.microseconds/ 1000.0た式( ) / 10**3との間には、浮動小数点演算による微妙な違いがあります。関連する回答の明示的な公式とリンクをtotal_seconds()
jfs

7

現在のUTC時間をミリ秒単位で取得する最も簡単な方法は次のとおりです。

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()

7

経過時間の測定が心配な場合は、単調時計(python 3)を使用する必要があります。たとえば、NTPクエリがシステム時間を調整した場合に見られるように、このクロックはシステムクロックの更新の影響を受けません。

>>> import time
>>> millis = round(time.monotonic() * 1000)

経過時間を測定するために後で比較するために使用できる秒単位の基準時間を提供します。


4

以下のコードを使用すると、時間は秒単位で表示され、10進数の後にミリ秒単位で表示されます。WindowsとUnixには違いがあると思います-ある場合はコメントしてください。

from time import time

x = time()
print(x)

私の結果(Windows上)は:

1576095264.2682993

編集:違いはありません:)ありがとうtc0nn


1
Mac OSXでの/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
差異

1
Ubuntu 18の差分なし:python3 scratch.py 1577212763.9136133
tc0nn '24

1

ミリ秒で1000になるこれらの乗算は、いくつかの前提条件を受け入れたり、解決したりするのに適切です。これは、実際には使用しないデータベースのギャップを埋めるために使用できます。ただし、正確なタイミングを必要とする実際の状況では、最終的に失敗します。アクションを必要とするミッションクリティカルな操作や特定のタイミングでの処理にこのメソッドを使用することはお勧めしません。

たとえば、米国では往復pingが30〜80ミリ秒です...単純にそれを切り上げて効率的に使用することはできません。

私の例では毎秒タスクが必要です。つまり、最初のタスクが応答した後に切り上げた場合でも、メインループサイクルごとに乗算された処理時間がかかります。これは、60秒ごとの合計関数呼び出しになります。1日1440です。あまり正確ではありません。

本当にそれを使用することのないデータベースのギャップを解決する以上に、より正確な推論を求めている人々のための考えです。


2
より良い解決策はありますか?また、正直言って、あなたの言っていることがまったくわかりません。「切り上げ」とはどういう意味ですか?
不可解な夜

2
理解を深めるための実際的な例でソリューションを説明してください
Ratan Uday Kumar

0

datetimePython 3 のモジュールを使用した別のソリューション。

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