2013-10-25 11 views
9

私はdatetimeモジュールの周りに頭を抱えようとしています。私は今、時代としての時代と、出来事が最後に起こった時代(時代の時代)を知っています。私がする必要があるのは、そのイベントが昨日の真夜中と深夜の間に起こったかどうかを調べることです。昨日の真夜中は何時だったのですか?

t = time.time() # is now 
t2 = 1234567890 # some arbitrary time from my log 

24時間前トンである - 86400が、どのように私は真夜中に上下に丸めることができます。タイムスタンプを日時の内外に取得したり、日時を操作して時刻を設定する方法を見つけるのが本当に困っています。最後の真夜中の生成

+1

日/深夜などの仕切りはエポック時代の一部ではないので、あなたは*正規の*時間に変換しなければならないような音があります。 – Gray

答えて

30

は簡単です:time.minと一緒に、今日の日付を兼ね備え

from datetime import datetime, date, time 

midnight = datetime.combine(date.today(), time.min) 

が真夜中にdatetimeオブジェクトを形成します。あなたのタイムスタンプは、これら2つの点の間にある場合

from datetime import timedelta 

yesterday_midnight = midnight - timedelta(days=1) 

今あなたがする必要があるすべてはテストです:

にまとめ
timestamp = datetime.fromtimestamp(some_timestamp_from_your_log) 
if yesterday_midnight <= timestamp < midnight: 
    # this happened between 00:00:00 and 23:59:59 yesterday 

あなたは以前真夜中を計算することができますtimedelta()

1つの機能:

from datetime import datetime, date, time, timedelta 

def is_yesterday(timestamp): 
    midnight = datetime.combine(date.today(), time.min) 
    yesterday_midnight = midnight - timedelta(days=1) 
    timestamp = datetime.fromtimestamp(some_timestamp_from_your_log) 
    return yesterday_midnight <= timestamp < midnight: 
+0

時間帯を指定しないで真夜中を知る方法はありますか? – sdanzig

+0

@sdanzig:デフォルトでは、 'datetime'モジュールはタイムゾーンを認識しません。 OSによって提供されるように、ローカルまたはUTC時間を返すことができます。このコードは現地時間を使用しています。 –

+1

この場合、すべてがUTCで実行されるため、問題はありません。 – t0mmyt

1

などのタイムスタンプを考えると、あなたは(あなたが気にしない)エポックからの数を計算するためにdivmodを使用することができ、そして(あなたがた)残り秒数です:

days_since, remaining_seconds = divmod(t, 24*3600) # Divide by number of seconds in one day 

次に、元のタイムスタンプから残った秒を減算します。これにより、現在の深夜 が生成されます。切り上げ

t -= remaining_seconds 

は正確に一日切り捨てる前に、前方にあなたの目標タイムスタンプをシフトするのと同じくらい簡単です。私の推定で

tomorrow_t = t + 24 * 3600 
days_since, remaining_seconds = divmod(tomorrow_t, 24*3600) 
t = tomorrow_t - remaining_seconds 
+0

私はそのアプローチについて考えましたが、実際にはmod 86400に行くつもりでしたが、閏秒を思い出しました。 – t0mmyt

+1

これらのタイムスタンプは、閏秒の影響を受けません。うるう秒が発生すると、UNIXエポックのタイムスタンプは単純に繰り返されるため、1日あたり86400秒の時間が保証されます。 '23:59:60'は23:59:59と00:00:00の間のうるう秒の任意のラベルです(またはうるう秒が適用されるたびに)。 – chepner

0

、多くの日付と時刻の操作は、矢印ライブラリを使用して、行うことは、理解しやすいです。これはその一つです。

任意の日付と時刻を作成します。

>>> import arrow 
>>> arbitrary = arrow.get(2017,8,16,11,5) 

計算midnight_yesterday:まず、その '日' floorとしてarbitraryの深夜。 shiftこれを1日後に返します。結果を表示します。

>>> midnight_yesterday = arbitrary.floor('day').shift(days=-1) 
>>> midnight_yesterday 
<Arrow [2017-08-15T00:00:00+00:00]> 

timestampを使用すると、Python 3.3以降では全体的に望ましい結果が得られます。

>>> midnight_yesterday.datetime.timestamp() 
1502755200.0 

または、この式をPython 2.7に使用してください。 (クレジット:後者の2つの式はhttps://stackoverflow.com/a/11743262/131187です。)

>>> (midnight_yesterday-arrow.get(1970,1,1)).total_seconds() 
1502755200.0 
関連する問題