んtime.time()
Pythonのtimeモジュールでシステムの時刻またはUTCの時刻を返しますか?
んtime.time()
Pythonのtimeモジュールでシステムの時刻またはUTCの時刻を返しますか?
回答:
このtime.time()
関数は、エポックからの秒数を秒単位で返します。「エポック」は、UTCでは1970年1月1日の開始と定義されていることに注意してください。つまり、エポックはUTCの観点から定義され、グローバルな瞬間を確立します。「エポックの過去秒」(time.time())がどこにあっても、同じ瞬間に同じ値が返されます。
これは私のコンピューターで実行したサンプル出力で、文字列に変換しています。
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>
ts
変数は、秒単位で返された時間です。次に、datetime
ライブラリを使用して文字列に変換し、人間が読める文字列にしました。
import time
datetimeが基本的にタイムスタンプを提供するのはなぜでしょうか。ミリ秒を削除するだけ–str(datetime.datetime.now()).split('.')[0]
time.time()
どのタイムゾーンにもありません。「エポックからの秒数」は用語です。ある時点(エポック)から経過した秒数ではありません。現地時間(tzデータベースを使用)やUTCタイムゾーンに簡単に変換できます。ところで、あなた.strftime()
が結果をドロップした場合、(ほぼ)同じです(+/-マイクロ秒)。
これは、テキストファイルで使用できるタイムスタンプのテキスト形式用です。(以前は質問のタイトルが異なっていたため、この回答の概要を変更して、時間と解釈できる方法を明確にしました。[2016年1月14日更新])
.now()
またはの.utcnow()
of を使用して、タイムスタンプを文字列として取得できますdatetime.datetime
。
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
now
異なるのutcnow
予想通り-そう、彼らは同じように動作します:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
タイムスタンプを文字列に明示的にレンダリングできます。
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
または、タイムスタンプを好きなようにフォーマットすることで、さらに明示的にすることができます。
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
ISO形式が必要な場合.isoformat()
は、オブジェクトのメソッドを使用します。
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
これらを変数で使用して、変換なしで計算と印刷を行うことができます。
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
悪です。現地時間ではない単純な日時を作成します。現地時間がUTCでない限り、それは間違っています。datetime.datetime.now(datetime.timezone.utc)
代わりに使用してください。これにより、現在の時間を表すタイムゾーン対応の日時が作成されます。
#squiguyからの回答に基づいて、真のタイムスタンプを取得するには、floatから型キャストします。
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
少なくともそれがコンセプトです。
type(time.time())
が与える<type 'float'>
int()
多態性です。long
古いPythonバージョンでは必要に応じて戻ります。新しいPythonバージョンではすべての整数が長くなります。
答えはどちらでもない、または両方かもしれません。
どちらも:time.time()
エポックから経過したおおよその秒数を返します。結果はタイムゾーンに依存しないため、UTCでも現地時間でもありません。これは、「エポック以降の秒数」のPOSIX定義です。
両方:time.time()
システムのクロックを同期する必要がないため、その値を反映します(ローカルタイムゾーンとは関係ありません)。コンピュータが異なれば、同時に異なる結果が得られる場合があります。一方、コンピューターの時刻が同期されている場合は、タイムスタンプからUTC時刻を簡単に取得できます(うるう秒を無視する場合)。
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
さまざまなPythonバージョンでUTC時間からタイムスタンプを取得する方法については、「UTCに従ってエポックからの秒数に変換された日付を取得するにはどうすればよいですか?」を参照してください。
time.time()
関数が返すものについてです(非常に短いです)。あなたのコメントは他のいくつかの質問に対処します(私が回答し始めてからコメントを変更しました。悪いことに)。余談ですが、「正しい」という言葉は控えめに使用する必要があります(タイムゾーンは複雑で、特効薬はありません。特定のユースケースとのトレードオフのみです)。
datetime.datetime.utcfromtimestamp(ts)
。現地時間がUTCでない限り、現地時間ではない単純な日時が作成されるため、これは誤ったものになります。datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
代わりに使用してください。これにより、タイムスタンプと同じ瞬間を表すタイムゾーン対応の日時が作成されます。
naive_dt.astimezone()
暗黙のように存在しませうbytes.encode()
、もはやそれは多くの場合、内部的にUTC時間で仕事に有益であることは事実であるのPython 3に存在しています。datetimeモジュールについて言えることはたくさんあります(私はゴールドバッジを獲得するのに十分な質問に回答しました)ほとんどは質問の対象外ですtime.time()
。
特定のタイムゾーンには「エポック」などはありません。エポックは特定の時間として明確に定義されているため、タイムゾーンを変更すると、時間自体も変更されます。具体的には、今回はJan 1 1970 00:00:00 UTC
。つまりtime.time()
、エポックからの秒数を返します。
タイムスタンプは常にutcの時刻ですが、呼び出すdatetime.datetime.fromtimestamp
と、このタイムスタンプに対応するローカルタイムゾーンの時刻が返されるため、結果はロケールに依存します。
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
arrow
動作が異なる素敵なライブラリが存在します。同じ場合、UTCタイムゾーンを持つ時間オブジェクトを返します。
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>