【问题标题】:Print date time repeatedly after specific time period在特定时间段后重复打印日期时间
【发布时间】:2021-06-13 14:26:40
【问题描述】:

我想在一分钟后打印代码

import time
from datetime import datetime
while True:
    time.sleep(1)
    now = datetime.now()
    current_datetime = now.strftime("%d-%m-%Y %H:%M:%S")
    if current_datetime==today.strftime("%d-%m-%Y") + "09:15:00":
        sec = 60
        time.sleep(sec)
        print("time : ", current_datetime)

我正在努力实现这些步骤。

  1. 在上午 9 点或之前开始运行代码。
  2. 检查是否正好是今天上午 09.15
  3. 打印时间
  4. 在 1 分钟后运行并打印。

输出:

'2021-06-14 09:15:00+05:30'
'2021-06-14 09:16:00+05:30'
'2021-06-14 09:17:00+05:30'
'2021-06-14 09:18:00+05:30'
'2021-06-14 09:19:00+05:30'
'2021-06-14 09:20:00+05:30'

以此类推,直到 '2021-06-14 14:30:00+05:30'

最好的pythonic方法是什么?

【问题讨论】:

  • 您的意思是要打印从 9:15 到 14:30 之后每分钟的时间?
  • 是的,我想这样做。

标签: python python-3.x python-2.7


【解决方案1】:

我可能会这样做

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 时开始。

【讨论】:

    【解决方案2】:

    如果您不介意,您可以使用名为 schedule(不是 pyschedule)的 python 模块 - 人类的 Python 作业调度

    pip install schedule

    您的需求:

    • 9:15 开始
    • 每 1 分钟打印一次(完成作业)
    • 直到 16:30

    schedule AFAIK 无法设置作业开始时间,但您可以进行“一次作业”来安排另一个路由作业:

    import schedule
    import time
    from datetime import datetime
    
    def start_once_job():
        #run routing job here if you want to do the job at 9:15:00
        job()
        # set new schedule to run every minute at the 00 second until 16:30
        # add 1 min if you want to do the job at 16:30:00
        #(because sleep(1) set to exactly 1 second to check, I think)
        schedule.every().minute.at(':00').until("2021-06-14 16:31").do(job)
        # cancel start_once_job
        return schedule.CancelJob
    
    def job():
        # do w/e you want
        print(f'print time I want: {str(datetime.now())}')
    
    schedule.clear() # clean all jobs for dev
    schedule.every().day.at('09:15').do(start_once_job)
    
    while True:
        schedule.run_pending()
        time.sleep(1)
    

    我的测试截图:

    注意:

    • 这是一个时间表,程序不会停止(While True:),你可以在While循环中给出一些条件来打破循环。
    • 取决于您的event loop 速度,有一点时间偏移,例如time.sleep(1) 应该会在 1 秒内换班。

    • 有了time.sleep(0.1),函数运行时间会变得更加重要,让shift不要在0.1s以内

    更多示例请参见https://schedule.readthedocs.io/en/stable/index.html

    【讨论】:

    • 从长远来看,程序运行时间会不准确?因为第一行是 .116351 第二行是 .183448 从长远来看,时间会改变。
    • 我还没有测试过,但我认为time.sleep(1)'事件循环'和触发后运行作业的一些延迟。我将测试更多时间以检查错误是否应在 IMO 2 秒内。
    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2017-10-15
    相关资源
    最近更新 更多