根据 Cron 时间表上的脚本 运行,根据当前时间从列表中选择最近的时间
Pick closest hour from a list, based on current time with script running on Cron schedule
我有一个 AWS Lambda Python 脚本,它在一天中的特定时间由 AWS Cloudwatch 事件规则(类似 cron)调用(参见下面的列表)。脚本被调用但不知道它是什么时候被调用的,所以逻辑需要在代码中,这没关系。
但是,我想说明这样一个事实,即当 脚本 运行s 时,可能会出现偶尔的延迟或时间点变化 (差异可能为毫秒、秒或分钟 - 负数或正数)。
我尝试了 datetime、timedelta、strptime 和 time 的一些组合。我试过计算时间差异并找到差异最小的那个,但负差异证明是有问题的。
这是我的清单:
hours_we_run_utc = [ '01:00', '07:00', '13:00', '15:00', '20:00' ]
curr_time = datetime.datetime.utcnow() #when Lambda/script was invoked.
我需要的:
例如,如果 curr_time 是 00:59:99 或 00:59:30 甚至 00:58:00,则脚本必须假设它是 运行 在 01:00.
例如,如果 curr_time 是 01:00:01 或 01:01:00 甚至 01:03:05,则脚本必须假设它是 运行 在 01:00.
所以,我用下面的代码得到了这个,但它看起来仍然 "hackey" 我期待 better/cleaner 解决方案:
from datetime import datetime
t_dict={}
hours_we_run_utc = [ '01:00', '07:00', '13:00', '15:00', '20:00' ]
FMT='%H:%M'
for hour in hours_we_run_utc:
s1 = datetime.utcnow().strftime(FMT) #Get current time
s2 = str(hour)
if s2>s1:
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)
else:
tdelta = datetime.strptime(s1, FMT) - datetime.strptime(s2, FMT)
t_dict[int(str(tdelta).replace(':', ''))] = hour
print t_dict[sorted(t_dict)[0]]
如果没有其他解决方案出现,我会在几天内做出这个 "the" 回答。
将 if
替换为 abs
调用并将 tdelta.total_seconds()
替换为唯一值可以收紧您的解决方案。
from datetime import datetime
t_dict={}
hours_we_run_utc = [ '01:00', '07:00', '13:00', '15:00', '20:00' ]
FMT='%H:%M'
for hour in hours_we_run_utc:
s1 = datetime.utcnow().strftime(FMT) #Get current time
s2 = str(hour)
tdelta = abs(datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT))
t_dict[tdelta.total_seconds()] = hour
print t_dict[sorted(t_dict)[0]]
我有一个 AWS Lambda Python 脚本,它在一天中的特定时间由 AWS Cloudwatch 事件规则(类似 cron)调用(参见下面的列表)。脚本被调用但不知道它是什么时候被调用的,所以逻辑需要在代码中,这没关系。
但是,我想说明这样一个事实,即当 脚本 运行s 时,可能会出现偶尔的延迟或时间点变化 (差异可能为毫秒、秒或分钟 - 负数或正数)。
我尝试了 datetime、timedelta、strptime 和 time 的一些组合。我试过计算时间差异并找到差异最小的那个,但负差异证明是有问题的。
这是我的清单:
hours_we_run_utc = [ '01:00', '07:00', '13:00', '15:00', '20:00' ]
curr_time = datetime.datetime.utcnow() #when Lambda/script was invoked.
我需要的:
例如,如果 curr_time 是 00:59:99 或 00:59:30 甚至 00:58:00,则脚本必须假设它是 运行 在 01:00.
例如,如果 curr_time 是 01:00:01 或 01:01:00 甚至 01:03:05,则脚本必须假设它是 运行 在 01:00.
所以,我用下面的代码得到了这个,但它看起来仍然 "hackey" 我期待 better/cleaner 解决方案:
from datetime import datetime
t_dict={}
hours_we_run_utc = [ '01:00', '07:00', '13:00', '15:00', '20:00' ]
FMT='%H:%M'
for hour in hours_we_run_utc:
s1 = datetime.utcnow().strftime(FMT) #Get current time
s2 = str(hour)
if s2>s1:
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)
else:
tdelta = datetime.strptime(s1, FMT) - datetime.strptime(s2, FMT)
t_dict[int(str(tdelta).replace(':', ''))] = hour
print t_dict[sorted(t_dict)[0]]
如果没有其他解决方案出现,我会在几天内做出这个 "the" 回答。
将 if
替换为 abs
调用并将 tdelta.total_seconds()
替换为唯一值可以收紧您的解决方案。
from datetime import datetime
t_dict={}
hours_we_run_utc = [ '01:00', '07:00', '13:00', '15:00', '20:00' ]
FMT='%H:%M'
for hour in hours_we_run_utc:
s1 = datetime.utcnow().strftime(FMT) #Get current time
s2 = str(hour)
tdelta = abs(datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT))
t_dict[tdelta.total_seconds()] = hour
print t_dict[sorted(t_dict)[0]]