2017-04-16 95 views
0

我有一个在后台运行的小脚本。每次我们过午夜,我都想做点什么。该脚本使用睡眠功能,因此它不确定是否在00:00:00醒来。所以,我想有这样的代码:Python:我们刚刚跨过午夜

last_time= time.now() 
while True: 
    if last_time < midnight && midnight < time.now(): 
     # do stuff 
     last_time= time.now() 
    sleep(some time) 

但我不知道如何正确的行if语句代码。

+4

为什么不只是使用cron作业? –

+2

在Python中,逻辑是'&'而不是'&&'。 –

回答

1

您可以使用datetime模块获取当前本地时间作为datetime对象。它的方便因为那个对象包含了一天。只要检查一下是否有变化。

import datetime 
import time 

last_day = datetime.datetime.now().day 
while True: 
    day = datetime.datetime.now().day 
    if day != last_day: 
     last_day = day 
     do_your_work() 
    time.sleep(some_time) 
0

如果您纯粹拥有时钟时间(我的意思是指一天中的小时/分钟/秒),则检查此方法的一种方法是查看新时间是否小于旧时间:每隔一个时钟例如,时间小于23:59:59。

当然,时间处理是混乱和可怕的,充满了例外 - 最值得注意的是,如果我们只是在秋季时钟变化中倒退呢?

更强大的解决方案可能是查看我们是否更改了日期:我可以考虑没有任何示例,如果您没有日期更改通过午夜。

0

所以我最后一次做这种事情我试图让事情时区的具体和帮助了我很多,所以这里是我想尝试做。请注意,我在这里使用了pytz库,所以你将不得不安装它。那么你也可能想把时区改成你所需要的。

from datetime import datetime, time 
from time import sleep 
import pytz 


def get_times(): 
    my_timezone = pytz.timezone('America/Los_Angeles') 
    last_time = my_timezone.normalize(datetime.now(tz=my_timezone)) 
    midnight = my_timezone.localize(datetime.combine(last_time.date(), time.max)) 
    return last_time, midnight 


def main(): 
    last_time, midnight = get_times() 

    while True: 
     if last_time > midnight: 
      # It's passed midnight we need to run it 
      # do work here... 
      # now we need to update midnight to todays midnight 
      last_time, midnight = get_times() 
     else: 
      # we shouldn't run the work just update last time 
      last_time, _ = get_times() 
     sleep(10) 

if __name__ == '__main__': 
    main()