22

私は過去1時間、Pythonのドキュメントと多くのSOの質問を掘り下げてきました。Pythonの時差の謎にとらわれたもう1人のPython初心者であることをお許しください。

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

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

これが私が試したことです...

  • 私の最初のバージョンは、文字列のタイムスタンプを取得し、それを複数の変数につなぎ合わせてから、それらを比較する関数でした。それは多くのエラーで不格好でした、そして私がそれをここに投稿したならば、私はプログラマーが投げる責任があるだろうと想像します。

  • 私はこの魔法のtimedelta関数に出くわし、ドキュメントと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のtimedelta:違い全体の値が欲しい時間単位を取得することはできませんか?

しかし、私はこれらの点を接続する方法に迷っています。

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

4

3 に答える 3

35

あなたが使用できるはずです

tdelta.total_seconds()

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

いくつかのメモ:

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

したがって、最終的なコードは次のようになります。

now = datetime.now()
then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
tdelta = now - then
seconds = tdelta.total_seconds()
于 2012-08-26T16:28:05.703 に答える
10

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

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

これtotal_secondsはPython2.7<でのみ使用可能ですが、ドキュメントによると次のようになります。

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

これはまったく同じ結果になります。

于 2012-08-26T16:28:36.537 に答える
2

私は数ヶ月前に同じ問題を抱えていました。探しているのは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())))
于 2012-08-26T17:02:41.657 に答える