2017-04-16 94 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()