python时间范围判断_python时间范围验证器

I have 2 parameters in DB: start and stop. value for them can be eg 07:00-23:00 or 23:00-07:00

(start after 07, stop after 23 or start after 23, stop after 07)

In that time, a status must be 0 or 1, let's say it's LED

How to create unified logic controller that won't mess up after/before midnight?

My poor implementation (wont work) is below. Actually, I've tried many-many variations and still ended up where I currently am..

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)

Updated version.

Determine current position in time relative to the end. end is set to tomorrow if midnight passes

n1 = datetime.now()

startTrig = datetime(n1.year, n1.month, n1.day, 23, 00, 0)

logger.debug("start: %s",startTrig)

n = datetime.now()

endTrig = datetime(n.year, n.month, n.day, 07, 00, 0)

logger.debug("end: %s",endTrig)

if startTrig > endTrig:

logger.debug("start > stop")

endTrig += timedelta(days=1)

logger.debug("new stop trig: %s",endTrig)

if datetime.now() < endTrig:

if curStatus == 1:

logger.debug("socket %s already on. doing nothing.")

elif curStatus == 0:

logger.debug("socket %s sould be on. flipping switch")

flipSocketStatus(bcmNo,bcmDir)

else:

logger.critical("unhandeled socket %s current status %s",socName,curStatus)

if curStatus == 1:

logger.critical("shutting socket %s down",socName)

GPIO.output(bcmNo, GPIO.LOW)

elif curStatus == 0:

logger.warn("socket %s already off",socName)

else:

logger.critical("unhandeled current status for pin: %s",bcmNo)

logger.critical("forcing socket %s down",socName)

GPIO.output(bcmNo, GPIO.LOW)

else:

logger.critical("unhandeled start-stop rules")

解决方案

There are two cases: the current time is between given times (clock-wise) or outside (imagine the clock circle):

#!/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()))

Output

02:26 is not in between 07:00-23:00

02:26 is in between 23:00-07:00

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值