我正试图绕过日期时间模块。我知道现在的时间作为一个时代和事件最后发生的时间(作为一个纪元时间)。我需要做的是弄清楚该事件是否发生在昨天的午夜和午夜之间。
t = time.time() # is now
t2 = 1234567890 # some arbitrary time from my log
24小时前是t - 86400,但我怎样才能将它上下调整到午夜。我很难找到一种方法来获取时间戳进出日期时间,或者操纵日期时间来设置时间。
答案 0 :(得分:41)
生成最后一个午夜很容易:
from datetime import datetime, time
midnight = datetime.combine(datetime.today(), time.min)
结合了今天的日期(您可以使用date()
或datetime()
实例,您的选择)以及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, 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)):
# ...
答案 1 :(得分: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
答案 2 :(得分:1)
要获取特定时区的午夜时间戳记:
from datetime import datetime
import pytz
TZ = "Asia/Shanghai"
datetime.now(pytz.timezone(TZ)).replace(hour=0, minute=0, second=0, microsecond=0).timestamp()
答案 3 :(得分:0)
根据我的估计,使用箭头库可以更轻松地进行许多日期和时间操作并理解。这是其中之一。
创建任意日期和时间。
>>> import arrow
>>> arbitrary = arrow.get(2017,8,16,11,5)
计算midnight_yesterday
:首先,arbitrary
的午夜作为其第一天&#39; 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
答案 4 :(得分:0)
今天开始的午夜是:
Promise
所以昨天的午夜是:
midnight = (int(time.time() // 86400)) * 86400
答案 5 :(得分: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
答案 6 :(得分: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 get unix epoch for today’s midnight and today’s 23:59:59 (start of day, end of day)