web-dev-qa-db-ja.com

Python-タイムスタンプ、timedeltaを使用した日付と時刻の比較

過去1時間、Pythonドキュメントと多くのSO質問。別のPython = Pythonの時差の謎に囚われた初心者。

私の目標は、過去/未来に関係なく現在の時刻と特定の日付/時刻の差を判断し、秒などの実行可能な形式を返すことです

たとえば、入力が2:00 PMと4:00 PM(現在)の場合、2時間前に発生したイベントを表す「-7200」と言います。入力が金曜日の午後4時(現在)と日曜日の午後5時の場合、出力は「176400」秒であり、現在から2日後と1時間後を表します。

ここに私が試したものがあります...

  • 私の最初のバージョンは、文字列のタイムスタンプを取得し、それを複数の変数に分割し、それらを比較する関数でした。それは多くのエラーで不格好でした、そして、私がそれをここに掲載するならば、私が投げるプログラマーに責任があると思います。

  • 私はこの魔法のタイムデルタ関数につまずき、ドキュメントとSOを調べましたが、私が探していることをやってくれるとは思いません。

  • 私は両方のタイムスタンプをエポック以降の秒に変換してから減算するというアイデアを持っていましたが、減算の順序が間違っている場合(イベントが将来の場合は異なるケース)、これはチェックするifステートメントを追加したい気がします秒の記号は不格好で、避けるべきものです。

これは、以前に解決されたSO質問)からの私の現在のコードです(「双方向」比較のためにまだ修正する必要があります):

now = time.strftime("%a %b %d %H:%M:%S %Y")
then = time.ctime(os.path.getmtime("x.cache"))
tdelta = datetime.strptime(now, '%a %b %d %H:%M:%S %Y') - datetime.strptime(then, '%a %b %d %H:%M:%S %Y')

そして、この質問のように、これから何とかして秒を引き出すことができるはずだと感じています: Pythonのタイムデルタ:差全体の値が必要な任意の時間単位に入れることはできませんか?

しかし、これらのドットを接続する方法については迷っています。

どうすればこれを達成できますか?

19
daltonf

使用できるはずです

tdelta.total_seconds()

あなたが探している価値を得るために。これは、tdeltatimedelta オブジェクトであり、datetimeオブジェクト間の違いがあるためです。

いくつかのメモ:

  1. strftimeに続いてstrptimeを使用することは不要です。 datetime.now で現在の日時を取得できるはずです。
  2. 同様に、time.ctimeに続いてstrptimeを使用することは、必要以上の作業です。 datetime.fromtimestamp で他のdatetimeオブジェクトを取得できるはずです。

したがって、最終的なコードは

now = datetime.now()
then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
tdelta = now - then
seconds = tdelta.total_seconds()
28
murgatroid99

この方法の何が問題になっていますか?

_>>> from datetime import datetime
>>> a = datetime.now()
>>> b = datetime.now() # after a few seconds
>>> delta = a-b
>>> delta.total_seconds()
-6.655989
_

_total_seconds_ はPython 2.7 <でのみ利用可能ですが、ドキュメントによると:

真の除算を有効にして計算された(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6と同等です。

まったく同じ結果が得られます。

9
Yuval Adam

数か月前に同じ問題が発生しました。探しているのは、datetime.timedeltaとdatetime.datetime.fromtimestamp()です。これらを使用して問題を解決する方法の例を次に示します。

import datetime
import time
t1 = time.time()
#do something to kill time or get t2 from somewhere
a = [i for i in range(1000)]
t2 = time.time()
#get the difference as datetime.timedelta object
diff=(datetime.datetime.fromtimestamp(t1) - datetime.datetime.fromtimestamp(t2))
#diff is negative as t2 is in the future compared to t2
print('difference is {0} seconds'.format(abs(diff.total_seconds())))
2
MHardy