我想讓我的頭繞着日期時間模塊。我知道現在的時間是一個時代,是上一次事件發生的時間(作爲一個時代)。我需要做的是弄清楚這個事件是否發生在昨天的午夜和午夜之間。什麼是昨天午夜作爲一個時代?
t = time.time() # is now
t2 = 1234567890 # some arbitrary time from my log
24小時前是t-86400,但是我怎樣才能把它上下翻到午夜。我很難找到一種方法來獲取日期時間和時間戳,然後操作日期時間來設置時間。
我想讓我的頭繞着日期時間模塊。我知道現在的時間是一個時代,是上一次事件發生的時間(作爲一個時代)。我需要做的是弄清楚這個事件是否發生在昨天的午夜和午夜之間。什麼是昨天午夜作爲一個時代?
t = time.time() # is now
t2 = 1234567890 # some arbitrary time from my log
24小時前是t-86400,但是我怎樣才能把它上下翻到午夜。我很難找到一種方法來獲取日期時間和時間戳,然後操作日期時間來設置時間。
生成最後的午夜很簡單:
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:
鑑於這樣的時間戳,您可以使用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
據我估計,很多日期和時間的操作是容易的事,並瞭解使用箭頭庫。這是其中之一。
創建任意日期和時間。
>>> 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
聽起來像你可能需要將它轉換爲* regular *時間在那裏,因爲像日/午夜等分隔符不是時代的一部分。 – Gray