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


560

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


87
タイムスタンプにはタイムゾーンがありません。エポックからの秒数を表します。エポックは、タイムゾーンに依存しない特定の瞬間です。
jwg

2
@jwg:一般的に使用されるPOSIXタイムスタンプはうるう秒をカウントしないため、「エポックからの[経過SI]秒数」ではありません(近い)。
jfs 2017

7
これは正確な@JFSebastianの反対意見ではないと思います。うるう秒は「エポックからの経過秒数」ではありません。これらは、経過秒数に対応しない時計によって記録された時間表現の変化です。
jwg 2017

4
@JFSebastian混乱してすみません。うるう秒は「経過秒」ではありません。したがって、「経過秒数」であるタイムスタンプには、うるう秒は含まれておらず、また含まれるべきではありません。
jwg 2017

2
@jwgが間違っています。物理的な時間を消去することはできません。POSIXタイムスタンプは、経過したSI秒数ではありません。次に例を示します。ニューヨークの「2016年12月31日午後6時59分59秒」と「2016年12月31日午後7時01分」の間に3秒経過しましたが、対応するPOSIXタイムスタンプの違いは2秒のみです(うるう秒はカウントされません)。
jfs

回答:


780

この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ライブラリを使用して文字列に変換し、人間が読める文字列にしました。


72
import timedatetimeが基本的にタイムスタンプを提供するのはなぜでしょうか。ミリ秒を削除するだけ–str(datetime.datetime.now()).split('.')[0]
フセイン2013年

17
@Alexis Unixエポックは、ここでかなり明確に定義されています。それは、ページのずっと下にあるPythonの例を示しています。コメントが理解できません。
squiguy 2013年

9
正直に言うと@squiguy私が何を言ったのか覚えていません。私は何かを誤解しているに違いありませんが、フランスと米国の間を移動している間にいくつかのテストが失敗した理由を見つけるのに苦労していました。申し訳ありませんが、指摘していただきありがとうございます。
Alexis

5
「秒単位のUTC」ではありませんによって返されるタイムスタンプはtime.time()どのタイムゾーンにもありません。「エポックからの秒数」は用語です。ある時点(エポック)から経過した秒数ではありません。現地時間(tzデータベースを使用)やUTCタイムゾーンに簡単に変換できます。ところで、あなた.strftime()が結果をドロップした場合、(ほぼ)同じです(+/-マイクロ秒)。
jfs 14

3
テストしたばかり、time.time()はUTC時間を与えず、ローカルゾーンの時間を与えます
sliders_alpha

301

これは、テキストファイルで使用できるタイムスタンプのテキスト形式用です。(以前は質問のタイトルが異なっていたため、この回答の概要を変更して、時間と解釈できる方法を明確にしました。[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

1
私はエポック時間を求めていました....日付形式ではありません...コマンドtime.time()についての私の言及から明らかだったように
Saransh Mohapatra

34
はい、問題ありません。テキストファイルに配置するために、他の誰かがタイムスタンプを言う必要があるかもしれません。
PEPrと

1
私はもう1人です。不当な賛成票が原因でリダイレクトされる可能性があります。質問は形式が正しくなく、一般的なニーズを誤解する受け入れられた回答です。最も使用されているサーバーのタイムゾーンで、人間が読める接尾辞(ファイル名など)を取得します。

文字列の一部としてタイムスタンプを出力するには、次を使用します:Python2:import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

datetime.datetime.utcnow()悪です。現地時間ではない単純な日時を作成します。現地時間がUTCでない限り、それは間違っています。datetime.datetime.now(datetime.timezone.utc)代わりに使用してください。これにより、現在の時間を表すタイムゾーン対応の日時が作成されます。
Terrel Shumway、

139

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

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

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


1
タイムスタンプを型キャストする理由は何ですか?デフォルトのタイプは何ですか?
Tizzee 2013

3
@Tizzee type(time.time())が与える<type 'float'>
有名なガーキン2014年

4
ただし、秒単位よりも正確な時間を必要とする場合は、フロートが理にかなっています。
2014

3
@RudiStrydom:Pythonは強く型付けされています。静的型付けと混同しないでください。
jfs

1
@CheokYanCheng:int()多態性です。long古いPythonバージョンでは必要に応じて戻ります。新しいPythonバージョンではすべての整数が長くなります。
jfs 2015

30

答えはどちらでもない、または両方かもしれません。

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

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

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

さまざまなPythonバージョンでUTC時間からタイムスタンプを取得する方法については、「UTCに従ってエポックからの秒数に変換された日付を取得するにどうすればよいですか?」を参照してください


4
:-(datetime.utcfromtimestampdatetime.fromtimestamp

@TerrelShumway問題は、time.time()関数が返すものについてです(非常に短いです)。あなたのコメントは他のいくつかの質問に対処します(私が回答し始めてからコメントを変更しました。悪いことに)。余談ですが、「正しい」という言葉は控えめに使用する必要があります(タイムゾーンは複雑で、特効薬はありません。特定のユースケースとのトレードオフのみです)。
jfs

使用しないでくださいdatetime.datetime.utcfromtimestamp(ts)。現地時間がUTCでない限り、現地時間ではない単純な日時が作成されるため、これは誤ったものになります。datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)代わりに使用してください。これにより、タイムスタンプと同じ瞬間を表すタイムゾーン対応の日時が作成されます。
Terrel Shumway、

はい。私の以前のコメントは全く間違っていました。datetimeモジュールのコードのほとんどは、単純な日付時刻を現地時間として扱います。単純な日時を使用することは、エンコーディングを知らなくてもテキストファイルを開くようなものです。
Terrel Shumway、

@TerrelShumway UTC時刻がローカル時刻であるシステムでのみ使用できると想定するのは誤りです。stdlibの一部の部分がナイーブなdatetimeオブジェクトをローカルのタイムゾーンを持つものとして(残念ながら)扱うのは事実です。私は好むnaive_dt.astimezone()暗黙のように存在しませうbytes.encode()、もはやそれは多くの場合、内部的にUTC時間で仕事に有益であることは事実であるのPython 3に存在しています。datetimeモジュールについて言えることはたくさんあります(私はゴールドバッジを獲得するのに十分な質問に回答しました)ほとんどは質問の対象外ですtime.time()
jfs

4

私は最終的に解決しました:

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

1
それはあなたの地元のニーズを満たすかもしれませんが、その範囲の数値が[GMT]エポックから数秒であると期待している人々を誤解させるかもしれません。time.time()戻り進/のようなフロート1574115250.818733とミリ秒-以来のエポックされやすいint(time.time() * 1000)など1574115254915
MarkHu

3

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


UTCは時間であること、それは本当だが、標準ではなく、時間帯、標準では、それはGMTと同じ時間を共有することです。だから....
クレイグヒックス

3

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