查找 x 小时前最近的中午或午夜

Finding most recent noon or midnight preceding x hours ago

我需要获取现在六小时前的最近中午 UTC 或午夜 UTC 的时间(以秒为单位)。换句话说,如果当前是 2022-05-17 04:00:00,我希望返回值 2022-05-16 12:00:00(2022-05-17 04:00:00 之前的六个小时是2022-05-16 22:00:00,因此在此之前最近的 noon/midnight 将是 2022-05-16 12:00:00).

我目前正在抓取 datetime.now(),使用 datetime.timedelta() 返回六个小时,抓取小时并使用条件设置午夜与中午,将其全部组合成一个字符串然后使用datetime.strptime() 转换回日期时间对象,另一个 datetime.timedelta() 检查纪元,最后 datetime.total_seconds()。我认为必须有一种更优雅的方式,我将非常感谢有关缩短此代码的建议(尽管它确实有效):

from datetime import datetime, timedelta

now = datetime.now()
six_hours_ago = now-timedelta(hours = 6)
six_hours_ago_date = six_hours_ago.date()
six_hours_ago_hour = six_hours_ago.hour
if six_hours_ago_hour < 12:
    gribtime_to_search = '00:00'
else:
    gribtime_to_search = '12:00'
gribdate_string_to_search = f"{str(six_hours_ago_date)} {gribtime_to_search}"
gribdatetime_to_search = datetime.strptime(gribdate_string_to_search, "%Y-%m-%d %H:%M")
epoch_timedelta = gribdatetime_to_search - datetime(1970, 1, 1)
seconds = epoch_timedelta.total_seconds()

回复 我可能会做类似下面的事情,在你计算 six_hours_ago:

six_hours_ago_midnight = datetime.combine(six_hours_ago, datetime.min.time())
if six_hours_ago - six_hours_ago_midnight >= timedelta(hours=12):
    return six_hours_ago_midnight + timedelta(hours=12)
else:
    return six_hours_ago_midnight

一种更简单的方法是使用 datetime.combinedatetime 对象组合成一个(time-zone 感知的)日期时间,如下所示。

我还会确保使用 datetime 方法,例如 utcnow()replace() 以及 tzinfo 参数,这样您就可以确保您使用的是 UTC 日期和时间。

from datetime import datetime, timedelta, time, timezone

# now = datetime.utcnow()
now = datetime.fromisoformat('2022-05-17 04:00:00').replace(tzinfo=timezone.utc)
print('Input:', now)

six_hours_ago = now - timedelta(hours=6)

six_hours_ago_date = six_hours_ago.date()
six_hours_ago_hour = six_hours_ago.hour
time_to_set: time = time.min if six_hours_ago_hour < 12 else time(hour=12)

# combine `date` and `time` into a UTC `datetime`
dt = datetime.combine(six_hours_ago_date, time_to_set, timezone.utc)
# get unix timestamp
seconds = round(dt.timestamp())

print('Result:', dt)
print('Epoch ts:', seconds)

结果:

Input: 2022-05-17 04:00:00+00:00
Result: 2022-05-16 12:00:00+00:00
Epoch ts: 1652702400