Python 昨天的午夜是什么时候?

Python 昨天的午夜是什么时候?,python,datetime,Python,Datetime,我正试着让我的头脑了解datetime模块。我知道现在的时间是一个大纪元,知道事件最后发生的时间(大纪元)。我需要做的是弄清楚这件事是否发生在昨天午夜和午夜之间 t = time.time() # is now t2 = 1234567890 # some arbitrary time from my log 24小时前是t-86400,但我怎么能把它整到午夜呢。我真的很难找到一种方法来获取datetime中的时间戳和datetime中的时间戳,或者在半夜操纵datetime来设置时间。 生成

我正试着让我的头脑了解datetime模块。我知道现在的时间是一个大纪元,知道事件最后发生的时间(大纪元)。我需要做的是弄清楚这件事是否发生在昨天午夜和午夜之间

t = time.time() # is now
t2 = 1234567890 # some arbitrary time from my log
24小时前是t-86400,但我怎么能把它整到午夜呢。我真的很难找到一种方法来获取datetime中的时间戳和datetime中的时间戳,或者在半夜操纵datetime来设置时间。

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

from datetime import datetime, time

midnight = datetime.combine(datetime.today(), time.min)
它将今天的日期(您可以使用
date()
datetime()
实例,由您选择)与一起在午夜形成一个
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
timestamp=datetime.fromtimestamp(日志中的一些时间戳)

如果昨天_midnight给出了这样一个时间戳,您可以使用
divmod
计算自该纪元起的天数(您不关心),以及剩余的秒数(您关心):

然后,从原始时间戳中减去剩余的秒数,这将生成午夜 当天的

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)
计算昨天的午夜
:首先,
任意
的午夜作为其“天”
楼层
;然后
shift
将此值向后移动一天。显示结果

>>> midnight_yesterday = arbitrary.floor('day').shift(days=-1)
>>> midnight_yesterday 
<Arrow [2017-08-15T00:00:00+00:00]>
或者将此表达式用于Python 2.7。(信用证:后两种表述)


今天开始的午夜是:

midnight = (int(time.time() // 86400)) * 86400
所以昨天的午夜是:

midnight = (int(time.time() // 86400)) * 86400 - 86400
您可以使用以下代码:

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


Source

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

from datetime import datetime
import pytz

TZ = "Asia/Shanghai"
datetime.now(pytz.timezone(TZ)).replace(hour=0, minute=0, second=0, microsecond=0).timestamp()

听起来你可能需要在那里的某个地方将其转换为常规时间,因为像days/midnight/等等分符不是大纪元时间的一部分。如果不指定时区,你如何判断午夜是什么时候?@sdanzig:默认情况下,
datetime
模块不支持时区。它可以返回操作系统提供的本地或UTC时间。这段代码使用本地时间。在这种情况下,这不是一个问题,因为所有东西都在UTC中运行。如果所有东西都在UTC中运行,那么它不仅很好,而且背后还有一个聪明的开发人员。不过要知道,“昨天”的概念只适用于英国认为的昨天。例如,如果您想根据写入日志的站点的时间来执行某些操作,则必须相应地指定时区。@hounded:您当然可以比较UNIX时间戳,但是
datetime
对象的用途更广,更不用说调试友好了。我考虑过这种方法,事实上,我刚要去mod 86400,但我记得闰秒。这些时间戳不受闰秒的影响。当发生闰秒时,UNIX历元时间戳只会重复,因此保证每天有86400秒。重复时间戳只是闰秒的另一个任意标签,如
23:59:60
是23:59:59和00:00:00之间(或应用闰秒时)的闰秒的任意标签。您必须使用//而不是%Mastisa-非常感谢您的更正;我正要自己做。
midnight = (int(time.time() // 86400)) * 86400
midnight = (int(time.time() // 86400)) * 86400 - 86400
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
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
from datetime import datetime
import pytz

TZ = "Asia/Shanghai"
datetime.now(pytz.timezone(TZ)).replace(hour=0, minute=0, second=0, microsecond=0).timestamp()