Python:如何检查时间是否超过指定的时间?

2024-10-01 00:31:00 发布

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

我在试着编一个停车场收费计算器。提供了各种费率: 上午7时至晚上10时30分-每30分钟收费0.60美元 晚上10:30至上午7:00的住宿费-统一收费5美元

如果停车时间从白天的费率溢出到夜间的费率,我该如何计算?下面是我现在的位置。我不知道该从这里走到哪里,也不知道这是不是一个正确的开始

def getCharge(self, endTime, startTime, rate):
    endTime = datetime.strptime(endTime, '%d/%m/%Y %H:%M')
    startTime = datetime.strptime(startTime, '%d/%m/%Y %H:%M')
    # elapsedDays = (endTime - startTime).days
    # print(elapsedDays)
    duration = (endTime - startTime).total_seconds() / 60
    print(duration)
    blocks = math.ceil( duration / 30 )
    print(blocks)
    charge = blocks * rate
    return charge

总结如下:

  1. 如果停车时间超过晚上10:30(将收取固定夜间费用),我如何添加支票
  2. 如果停车持续时间超过夜间小时并在早上7点后进入第二天早上,我如何添加检查(前一天的日间费率+夜间费率+第二天的日间费率)

Tags: datetimerate时间计算器durationprint费率starttime
2条回答

最简单的方法是每30分钟迭代一次,并以此方式计算费用

HALFHOUR_RATE = 0.6
NIGHT_FEE = 5


def get_charge(start_datetime, end_datetime):
    tmp_datetime = start_datetime
    charged = 0
    last_night_charged_day = None

    while tmp_datetime < end_datetime:
        if tmp_datetime.hour >= 22 or tmp_datetime.hour < 7:
            if tmp_datetime.hour == 22 and tmp_datetime.minute < 30:
                # Still not a night
                charged += HALFHOUR_RATE
            # It is a night
            else:
                day = tmp_datetime.day
                if tmp_datetime.hour < 7:
                    day -= 1
                if day != last_night_charged_day:
                    last_night_charged_day = day
                    # Charge one time night fee
                    charged += NIGHT_FEE
        else:
            # It is a day
            charged += HALFHOUR_RATE
        tmp_datetime += datetime.timedelta(minutes=30)

    return charged

根据Alex的回答,这里有一个稍微优化和改进的解决方案:

import datetime

HALFHOUR_RATE = 0.6
NIGHT_FEE = 5

def get_charge2(start_datetime, end_datetime):
    tmp_datetime = start_datetime
    charged = 0

    while tmp_datetime < end_datetime:
        if tmp_datetime.hour >= 7 and tmp_datetime.hour < 22 or (tmp_datetime.hour == 22 and tmp_datetime.minute < 30):
            # It is a day [7, 22:30)
            charged += HALFHOUR_RATE * 10 # avoid rounding error
            tmp_datetime += datetime.timedelta(minutes=30)
        else:
            # It is a night [22:30, 7)
            charged += NIGHT_FEE * 10  # avoid rounding error
            tmp_datetime += datetime.timedelta(hours=8.5) # night == 8.5 hours
   
    return charged/10 # adjust result

相关问题 更多 >