我可能会这样做
from datetime import datetime, timedelta
import time
# Prepare variables (optional)
format = '%Y%m%d'
s_offset = timedelta(hours=9, minutes=15)
e_offset = timedelta(hours=14, minutes=30)
today = datetime.strptime(datetime.strftime(datetime.now(), format), format)
# Sleep to 09:15
time.sleep((today + s_offset).timestamp() - datetime.now().timestamp())
while datetime.now() <= today + e_offset:
print(datetime.strftime(datetime.now(), format + '%H:%M:%S'))
next_minute = datetime.now() + timedelta(minutes=1)
next_minute -= timedelta(microseconds=next_minute.microsecond)
# There is still some minor precision error
time.sleep(next_minute.timestamp() - datetime.now().timestamp())
如果精度不是那么重要,您可以只在循环中使用time.sleep(60)。
错误来自执行时间,例如print()。因为打印需要一点时间,time.sleep(60) 会使您的下一个循环延迟超过 1 分钟,并且随着循环的进行,延迟会累积。
我这里的方法并不完美,但错误不是累积的。
作为插图
time.sleep(1):
2021-06-14 00:17:32.000943
2021-06-14 00:17:33.002100
2021-06-14 00:17:34.002950
2021-06-14 00:17:35.003826
2021-06-14 00:17:36.004899
2021-06-14 00:17:37.005018
2021-06-14 00:17:38.005386
2021-06-14 00:17:39.005517
2021-06-14 00:17:40.005897
2021-06-14 00:17:41.006309
2021-06-14 00:17:42.006673
2021-06-14 00:17:43.007091
2021-06-14 00:17:44.007445
2021-06-14 00:17:45.007853
2021-06-14 00:17:46.008831
我的做法:
2021-06-14 00:17:48.000917
2021-06-14 00:17:49.000290
2021-06-14 00:17:50.000906
2021-06-14 00:17:51.000326
2021-06-14 00:17:52.000929
2021-06-14 00:17:53.000265
2021-06-14 00:17:54.000915
2021-06-14 00:17:55.000483
2021-06-14 00:17:56.000719
2021-06-14 00:17:57.000841
2021-06-14 00:17:58.000428
2021-06-14 00:17:59.000890
2021-06-14 00:18:00.000909
2021-06-14 00:18:01.000943
2021-06-14 00:18:02.000704
两个循环都在 microseconds=0 时开始。