繁体   English   中英

如何检查时间是否在日期范围内

[英]How to check if a time is within a range with date

我找到了一些解决方案,但大多数都在谈论当前日期。 我想要的是检查当前时间是否在23:00:0007:00:00内。 我面临困难,因为日期也涉及到这一点。 因此,如果当前时间是00:00:00那么日期也会更改,将时间与当天23:00:00进行比较会给我带来错误的结果。 这就是我现在想出的。 请帮助我找到解决方案

cur_time = dt.strptime('2/9/16 00:00', "%m/%d/%y %H:%M")
prev_date = dt.strftime(cur_time.date() - timedelta(days=1), "%m/%d/%y")
same_date = dt.strftime(cur_time.date(), '%m/%d/%y')
dosta = dt.strptime(prev_date + "22:00", "%m/%d/%y%H:%M")
satta = dt.strptime(same_date + "07:00", "%m/%d/%y%H:%M")
if dosta < cur_time < satta:
    tariff = 3
else:
    tariff = 6
print(tariff)

这将导致关税为3,但是如果我这样更改cur_time

cur_time = dt.strptime('2/9/16 23:00', "%m/%d/%y %H:%M")

这不会产生3。这会给我6。因为这会将当前时间与前一天00:00 ,今天07:00和当前23:00进行比较。

编辑1

Input: 2/9/16 06:00:00

Output: 3...because 06:00:00 is less than 07:00:00 that same day(2/9/2016) and more than 22:00:00 previous day(2/8/16)

Input: 2/9/16 23:00:00 Output: 3...because 23:00:00 is more than 22:00:00 that same day(2/9/2016)

Input: 2/10/16 00:30:00 Output: 3...because 00:30:00 is more than 22:00:00 that previous day(2/9/2016) and less than 07:00:00 same day(2/10/2016)

Input: 2/10/16 08:00:00 Output: 6...because 08:00:00 is more than 07:00:00 that same day(2/9/2016) and less than 22:00:00 on the same day(2/9/2016)

编辑2timedelta所指出的,它仍然无法使用@a_guest 这是代码

for each in zip(data1, data2):
    # client.write_points(json_body_bill_data)
    cur_time = dt.strptime(each[1]['Start'], "%m/%d/%y %H:%M")
    # print(cur_time.date())
    dosta = dt.strptime('2200', '%H%M').time()
    # print(dosta)
    lower = datetime.datetime.combine(cur_time.date(), dosta)
    upper = lower + timedelta(hours=8.5)
    print("lower", lower)
    print("upper", upper)
    print(cur_time, lower < cur_time < upper)

这是给我的错误,如果cur_time00:00:00 9/2/16

编辑3

可能的答案

from datetime import datetime, time
import csv
import os


CSV_FILE_ASCO = os.path.join('..', 'res', 'ASCO_METER.csv')
with open(CSV_FILE_ASCO, 'r') as f:
    reader = csv.DictReader(f)
    data = list(reader)

for each in data:
    # print()
    cur_date = datetime.strptime(each['Start'], "%m/%d/%y %H:%M")
    if time(7, 0) <= cur_date.time() < time(22, 0):
        tarrif = 6
    else:
        tarrif = 3
    print(cur_date, end=" ")
    print(tarrif)

可以进一步改进。 我敢肯定,必须有一种更Python化的方式来做到这一点

听起来最简单的解决方案是完全删除日期,然后自己比较小时值。 如果给定时间大于7 AM但小于11 PM,则tarrif = 3 ,否则tarrif = 6 您可以使用datetime对象的hour属性来执行此操作:

from datetime import datetime

cur_date = datetime.strptime('2/9/16 07:00', "%m/%d/%y %H:%M")
if 7 <= cur_date.hour < 23:
    tarrif = 3
else:
    tarrif = 6

为了精确起见,我假设tarrif在该点的上午7点从6变为3,然后在该点的11PM变为6。

在比较期间忽略日期,并检查时间是否> 23:00或<07:00。 检查工作提琴

import datetime
dosta = datetime.datetime.strptime("23:00", '%H:%M')
satta = datetime.datetime.strptime("07:00", '%H:%M')

print dosta.time(), satta.time()

for h in range(0,24):

    h = str(h).zfill(1)
    cur_time = datetime.datetime.strptime('2/9/16 {h}:00'.format(h=h), "%m/%d/%y %H:%M")

    if cur_time.time() > dosta.time() or cur_time.time() < satta.time():
        print "IN RANGE " + h
    else:
        print "OUT OF RANGE " + h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM