You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python datetime库实现UTC时区特定时间的倒计时器?(解决每分钟打印剩余时长异常问题)

优化UTC倒计时器:实现每分钟打印剩余分钟数

嘿,我来帮你搞定这个倒计时的问题!先看看你原代码里的问题所在:

你的if条件(60 - (start_script - datetime.now(timezone.utc)).total_seconds() % 60)其实只要这个计算结果不为0,就会触发打印——但这个值几乎永远不会等于0(除非刚好卡在整秒的瞬间),所以循环会每秒甚至更频繁地输出内容。另外,无限循环里没有任何延迟,还会导致CPU占用过高,这也是需要优化的点。

下面给你两种更优的实现方案,都能精准做到每分钟打印一次剩余分钟数:

方案1:记录上一次打印的分钟数(轻量高效)

这个方案通过记录上一次输出的剩余分钟数,只有当分钟数变化时才打印,同时加入每秒延迟避免CPU空转:

from datetime import datetime, timezone
import time

# 目标UTC时间
start_script = datetime(2022, 7, 9, 13, 50, tzinfo=timezone.utc)

def timer():
    last_printed_minute = None
    while True:
        now = datetime.now(timezone.utc)
        remaining_time = start_script - now
        
        # 倒计时结束就退出循环
        if remaining_time.total_seconds() < 0:
            break
        
        # 计算当前剩余的完整分钟数(向下取整)
        current_remaining_minutes = int(remaining_time.total_seconds() // 60)
        
        # 只有当剩余分钟数变化时才打印
        if current_remaining_minutes != last_printed_minute:
            print(f"RUNNING IN MINUTES: {current_remaining_minutes}")
            last_printed_minute = current_remaining_minutes
        
        # 每秒检查一次,降低CPU消耗
        time.sleep(1)

timer()
print("RUN MY SCRIPT NOW!!!")

方案优势:

  • 避免重复计算datetime.now(),提升代码效率;
  • 用time.sleep(1)控制循环频率,大幅降低CPU占用;
  • 通过last_printed_minute精准控制打印时机,确保每分钟只输出一次。

方案2:直接Sleep到下一次打印时间(更省资源)

如果倒计时时长很长,这个方案会更高效——每次打印后直接计算下一次需要输出的时间,然后Sleep到那个时间,不需要每秒检查:

from datetime import datetime, timezone, timedelta
import time

start_script = datetime(2022, 7, 9, 13, 50, tzinfo=timezone.utc)

def timer():
    while True:
        now = datetime.now(timezone.utc)
        remaining_time = start_script - now
        
        if remaining_time.total_seconds() < 0:
            break
        
        current_remaining_minutes = int(remaining_time.total_seconds() // 60)
        print(f"RUNNING IN MINUTES: {current_remaining_minutes}")
        
        # 计算下一次打印的时间:当前时间加1分钟,不超过目标时间
        next_print_time = now + timedelta(minutes=1)
        sleep_until = min(next_print_time, start_script)
        
        # 计算需要Sleep的秒数,避免负数
        sleep_duration = max(0, (sleep_until - now).total_seconds())
        time.sleep(sleep_duration)

timer()
print("RUN MY SCRIPT NOW!!!")

方案优势:

  • 不需要每秒循环检查,资源占用极低;
  • 精准控制打印间隔,不会因为系统时间误差导致多次打印;
  • 当倒计时接近结束时,会自动Sleep到目标时间,避免多余的循环。

这两种方案都解决了你原代码的问题,你可以根据自己的需求选择合适的版本~

内容的提问来源于stack exchange,提问作者bbartling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:28:13