web-dev-qa-db-ja.com

Pythonのtime.time()はローカルまたはUTCのタイムスタンプを返しますか?

Pythonのtimeモジュールのtime.time()はシステムの時刻またはUTCの時刻を返しますか?

491

time.time() 関数は、エポック以降の秒数を秒数で返します。 "Epoch"はUTCで1970年1月1日の始まりとして定義されていることに注意してください。そのため、エポックはUTCの観点から定義され、世界的な時期を確立します。あなたが "Epochを過ぎた秒数"(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ライブラリを使って文字列に変換し、人間が読める形式の文字列にしました。

706
squiguy

これは、テキストファイルで使用できるテキスト形式のタイムスタンプ用です。 (質問の題名はこれまでとは異なっていたので、この答えの序文を変更して時間としてどのように解釈できるかを明確にしました。

datetime.datetime.now()または.utcnow()を使用して、タイムスタンプを文字列として取得できます。

>>> 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
281
pepr

#squiguyからの答えに基づいて、本当のタイムスタンプを取得するには、floatからキャストします。

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

少なくともそれがコンセプトです。

122
Rudi Strydom

答えはどちらでもないし両方でもよい。

  • どちらも:time.time()は、エポックから経過したおよそ秒数を返します。結果はタイムゾーンに依存しないため、UTCでも現地時間でもありません。これが 「エポックからの秒数」に対するPOSIXの定義です

  • 両方:time.time()はシステムの時計を同期させる必要がないのでその値を反映します(ただしローカルタイムゾーンとは関係ありません)。コンピュータが異なれば、同時に異なる結果が出る可能性があります。一方、コンピュータの時刻同期されている場合は、タイムスタンプからUTC時刻を取得するのは簡単です(うるう秒を無視した場合)。

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)
    

さまざまなPythonバージョンでUTC時刻からタイムスタンプを取得する方法については、 UTCに従ってエポック以降の日付を秒に変換する方法を参照してください。

25
jfs

私は結局決着しました:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
3
Natim

特定のタイムゾーンには「エポック」のようなものはありません。エポックは特定の瞬間の時間として明確に定義されているので、タイムゾーンを変更すると、時間自体も変更されます。具体的には、今回はJan 1 1970 00:00:00 UTCです。そのため、time.time()はエポックからの経過秒数を返します。

2
HyperNeutrino

タイムスタンプは常にutcの時刻ですが、datetime.datetime.fromtimestampを呼び出すと、このタイムスタンプに対応するローカルタイムゾーンの時刻が返されるため、結果はロケールに依存します。

>>> import time, datetime, arrow

>>> 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タイムゾーンで時間オブジェクトを返します。

>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>