python时间范围有效

2024-05-14 15:00:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个参数在数据库:启动和停止。它们的值可以是07:00-23:00或23:00-07:00 (07后开始、23后停止或23后开始、07后停止)

在那个时候,一个状态必须是0或1,比如说它是LED

如何创建一个统一的逻辑控制器,不会在午夜前后出现故障?在

下面是我糟糕的执行情况(不起作用)。事实上,我尝试了很多不同的方法,但最终还是达到了目前的水平。。在

            if curtime >= vv_time_trig1 and curtime <= vv_time_trig2:
                logger.info("turning socket on")
                logger.debug("#1")

                #check current status
                #if current is 0
                #turn socket on
                if vvstatus == 0:
                    logger.debug("current status off, turning socket on")
                    GPIO.output(25, GPIO.HIGH)

                #check current status
                #if current is already 1
                #do nothing
                elif vvstatus == 1:
                    logger.info("skiping. already on")

                #unhandeled current status
                else:
                    logger.critical("unhandeled vvstatus!")
                    logger.critical("turning socket off")
                    GPIO.output(25, GPIO.LOW)

            #if current time is before start
            #turn off
            elif curtime <= vv_time_trig1 and curtime >= vv_time_trig2:
                logger.info("turning socket off")
                logger.debug("#2")

                #check current status
                #if current is 1
                #turn socket off
                if vvstatus == 1:
                    logger.debug("current status on, turning socket off")
                    GPIO.output(25, GPIO.LOW)

                #check current status
                #if current is already 0
                #do nothing
                elif vvstatus == 0:
                    logger.info("skiping. already off")

                #unhandeled current status
                else:
                    logger.critical("unhandeled vvstatus!")
                    logger.critical("turning socket off")
                    GPIO.output(25, GPIO.LOW)

            #if current time is after stop
            #turn off
            elif curtime >= vv_time_trig2:
                logger.info("turning socket off")
                logger.debug("#3")

                #check current status
                #if current is 1
                #turn socket off
                if vvstatus == 1:
                    logger.debug("current status: %s, turning socket off", vvstatus)
                    GPIO.output(25, GPIO.LOW)

                #check current status
                #if current is already 0
                #do nothing
                elif vvstatus == 0:
                    logger.info("skiping. already on")

                #unhandeled current status
                else:
                    logger.critical("unhandeled vvstatus!")
                    logger.critical("turning socket off")
                    GPIO.output(25, GPIO.LOW)

            #if current time is before stop
            #turn off
            elif curtime <= vv_time_trig2 and curtime <= vv_time_trig1:
                logger.info("turning socket on")
                logger.debug("#4")

                #check current status
                #if current is 0
                #turn socket on
                if vvstatus == 0:
                    logger.debug("current status off, turning socket on")
                    GPIO.output(25, GPIO.HIGH)

                #check current status
                #if current is already 1
                #do nothing
                elif vvstatus == 1:
                    logger.info("skiping. already on")

                #unhandeled current status
                else:
                    logger.critical("unhandeled vvstatus!")
                    logger.critical("turning socket off")
                    GPIO.output(25, GPIO.LOW)

更新版本。 确定相对于终点的当前位置。如果午夜过去,就定在明天结束

^{pr2}$

Tags: debuginfogpioiftimeisoncheck
2条回答

有两种情况:当前时间在给定时间之间(时钟方向)或外部(想象时钟周期):

#!/usr/bin/env python
from datetime import datetime

def in_between(now, start, end):
    if start < end: # e.g., "07:00-23:00"
        return start <= now < end
    elif end < start: # e.g., "23:00-07:00"
        return start <= now or now < end
    else: # start == end
        return True # consider it 24 hour interval

now = datetime.now().time()
for date_range in ["07:00-23:00", "23:00-07:00"]:
    start, end = [datetime.strptime(s, "%H:%M").time()
                  for s in date_range.split("-")]
    not_ = '' if in_between(now, start, end) else 'not '
    print("{now:%H:%M} is {not_}in between {date_range}".format(**vars()))

输出

^{pr2}$

更新:根据您的更新

这看起来更好,我唯一困惑的是你的if datetime.now() < endTrig条件。在

如果我仍然误解了您,请更正我,但您当前的条件看起来像是:

if now() is before endTrigger:
  - if status is 1, we are good, stay on
  - if status is 0, turn on
  - if status is anything else (but cant it only be 1 or 0?):
    * if status is 1 ... (but wait, we already checked for this above!)
    * if status is 0 ... (ditto, these two checks will never trigger)
    * otherwise, force off
if now() is after endTime:
  - some logging (shouldnt this be where we turn off?)

您提到的状态必须是0或1。基于此,我希望你的条件看起来像:

^{pr2}$

相关问题 更多 >

    热门问题