2013-04-14 68 views
3

我是个脚本的运行部分每分钟只有一次,并想出了这一点:这里Python的检查,如果一分钟已经过去了

def minutePassed(oldminute): 
    currentminute = time.gmtime()[4] 

    if ((currentminute - oldminute) >= 1) or (oldminute == 59 and currentminute >= 0): 
     return True 
    else: 
     return False 

问题是,如果一分钟是59它每次运行到其过去的那个时候 - 对我来说,这并不是太麻烦的表现。但我仍然不喜欢它发生!

我现在想的是这样的:

def minutePassed(oldminute): 
    currentminute = time.gmtime()[4] 

    if ((currentminute - oldminute) >= 1) or (oldminute == 59 and currentminute >= 0 and ran == false): 
     ran = True 
     return True 
    else: 
     return False 

然后在剧本我转身又跑虚假的另一部分当一分钟= 59和可变心不是已经假 - 但似乎粗!?

另一方面 - 有没有其他方法来检查一分钟是否已经过去?也许我把事情复杂化......

编辑:也许我还不够清楚:

  1. 运行,每分钟只有一次。
  2. 执行时间变化很多秒,但少于30秒。

我正在看timedelta吧。

+0

没有时间写出完整的答案(别人可以拥有它),但你应该使用'datetime.timedelta'。 http://docs.python.org/2/library/datetime.html – kojiro

+0

哇.. timedelta - 这似乎是它!之前没见过这让我感觉不好! – Jrc

回答

0

使用time.sleep

from time import sleep 

while True: 
    # do something 
    sleep(60) 
+0

不可能 - 这只是我每分钟运行一次脚本的一部分 - 它不是唯一的东西。 – Jrc

+0

@Jrc,你可以把它放在一个不同的线程 – Jacopofar

5

您可以使用纪元以来的秒数,以获得在几秒钟的时间,所以你不必担心分钟缠绕:

import time 
oldtime = time.time() 
# check 
if time.time() - oldtime > 59: 
    print "it's been a minute" 
12

不要工作有这样的分钟;如果时间是00:00:59,那么你的代码会相信一分钟已经过去了。

相反,使用类似time.time(),返回从epoch传递秒:

def minute_passed(oldepoch): 
    return time.time() - oldepoch >= 60 

这仍然可以通过几乎是第二个同样的原因被关闭,但是这可能更容易接受。

+0

关键是 - 它每分钟运行一次 - 如果分钟后超过一秒钟,那没关系。根据检索其他数据需要多长时间,脚本的其余部分可能需要5到25秒的时间。 – Jrc

0

我想你会发现在time模块中使用time()函数要容易得多,该函数返回自'epoch'以来经过的秒数。

import time 

oldtime = time.time() 

def minutePassed(oldtime): 
    currenttime = time.time() 
    if currenttime - oldtime > 60 and ran == False: 
     ran = True 
     return True 
    else: 
     return False 
0

我曾与timedelta不是很成功,所以我就用我以前的不成熟的思想:

def minutePassed(oldminute): 
    currentminute = time.gmtime()[4] 

    if ((currentminute - oldminute) >= 1) or (oldminute == 59 and currentminute == 0): 
     return True 
    else: 
     return False 

然后在脚本:

while True: 
    dosomething() 

    if minutePassed(time.gmtime(lastrun)[4]): 
     domore 
     lastrun = time.time() 

这对我现在的工作完全没有问题 - 只有一分钟运行 - 睡眠或任何对我来说都是不好的选择,因为每个循环的执行时间都不可靠。

0

我有完全相同的问题,我想我找到了解决办法:

import time 


oldtime = time.time() 
print oldtime 

while oldtime + 60 != time.time(): 

    if oldtime + 3 == time.time(): 
     print "60 secs passed" 
     print time.time() 
     break 

您可以删除打印语句,我让他们那里只是为了看看它是否工作,希望这是你在找什么。

相关问题