我想让我的头绕着日期时间模块。我知道现在的时间是一个时代,是上一次事件发生的时间(作为一个时代)。我需要做的是弄清楚这个事件是否发生在昨天的午夜和午夜之间。什么是昨天午夜作为一个时代?
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