25

我试图了解 datetime 模块。我知道现在的时间是一个纪元,而事件上次发生的时间(作为纪元时间)。我需要做的是弄清楚该事件是否发生在昨天的午夜和午夜之间。

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

24 小时前是 t - 86400,但我怎么能把它上下四舍五入到午夜。我很难找到一种方法来获取时间戳进出日期时间,或者然后操纵日期时间来设置时间。

4

7 回答 7

61

在半夜

生成最后一个午夜很容易:

from datetime import datetime, time

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

这结合了今天的日期(您可以使用date()datetime()实例,您的选择),以及在午夜time.min形成一个datetime对象。

昨天

使用 atimedelta()您可以计算前一个午夜:

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, time, timedelta

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

if is_yesterday(datetime.fromtimestamp(some_timestamp_from_your_log)):
    # ...
于 2013-10-25T16:21:03.283 回答
2

给定这样的时间戳,您可以使用它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
于 2013-10-25T16:36:55.390 回答
2

要获取特定时区的午夜时间戳:

from datetime import datetime
import pytz

TZ = "Asia/Shanghai"
datetime.now(pytz.timezone(TZ)).replace(hour=0, minute=0, second=0, microsecond=0).timestamp()
于 2020-09-24T06:14:22.457 回答
2

今天开始的午夜是:

midnight = (int(time.time() // 86400)) * 86400

所以昨天的午夜是:

midnight = (int(time.time() // 86400)) * 86400 - 86400
于 2018-12-30T17:36:32.197 回答
0

您可以使用以下代码:

import time

seconds_of_day = 24 * 60 * 60  # 86400
last_midnight = (round(time.time()) // seconds_of_day) * seconds_of_day
yesterday_last_midnight = last_midnight - seconds_of_day
于 2019-01-01T10:10:08.670 回答
0
import time

start_str = time.strftime( "%m/%d/%Y" ) + " 00:00:00"
end_str = time.strftime( "%m/%d/%Y ") + " 23:59:59"
start_ts = int( time.mktime( time.strptime( start_str, "%m/%d/%Y %H:%M:%S" ) ) )
end_ts = int( time.mktime( time.strptime( end_str, "%m/%d/%Y %H:%M:%S" ) ) )

print (start_ts) # timestamp today at 00:00:00
print (end_ts) # timestamp today at 23:59:59
# 1552435200
# 1552521599

Python 获取今天午夜和今天 23:59:59 的 unix 纪元(一天的开始,一天的结束)

于 2019-03-13T18:36:49.967 回答
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]>

用于timestampPython 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
于 2017-08-29T16:29:41.930 回答