2013-10-25 30 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