查找 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.combine
将 date
和 time
对象组合成一个(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
我需要获取现在六小时前的最近中午 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.combine
将 date
和 time
对象组合成一个(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