2013-10-25 28 views
9

我想讓我的頭繞着日期時間模塊。我知道現在的時間是一個時代,是上一次事件發生的時間(作爲一個時代)。我需要做的是弄清楚這個事件是否發生在昨天的午夜和午夜之間。什麼是昨天午夜作爲一個時代?

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

24小時前是t-86400,但是我怎樣才能把它上下翻到午夜。我很難找到一種方法來獲取日期時間和時間戳,然後操作日期時間來設置時間。

+1

聽起來像你可能需要將它轉換爲* regular *時間在那裏,因爲像日/午夜等分隔符不是時代的一部分。 – Gray

回答

30

生成最後的午夜很簡單:

from datetime import datetime, date, time 

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

time.min結合今天的日期,一起在午夜形成datetime對象。

隨着timedelta()可以計算出以前午夜:

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 

組合成一個功能:

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'模塊不是時區感知的。它可以返回本地或UTC時間,由OS提供。此代碼使用本地時間。 –

+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

我想到了這種方法,其實我只是想去修改86400,但後來我想起了閏秒。 – t0mmyt

+1

這些時間戳不受閏秒的影響。當發生閏秒時,UNIX曆元時間戳簡單地重複,所以你保證每天有86400秒。重複時間戳只是閏秒的另一個任意標籤,例如'23:59:60'是23:59:59和00:00:00之間的閏秒的任意標籤(或每當應用閏秒時)。 – chepner

0

據我估計,很多日期和時間的操作是容易的事,並瞭解使用箭頭庫。這是其中之一。

創建任意日期和時間。

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

計算midnight_yesterday:第一,arbitrary作爲其 '日' floor午夜;然後shift這回來了一天。顯示結果。

>>> 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使用此表達式。 (信貸:https://stackoverflow.com/a/11743262/131187爲後兩個表達式。)

>>> (midnight_yesterday-arrow.get(1970,1,1)).total_seconds() 
1502755200.0