Python: 如何判断时间是否超过指定时间?
Python: How do I check if time exceeds a specified time?
我正在尝试编写一个停车场收费计算器。提供各种费率:
从早上 7 点到晚上 10.30 - 每 30 分钟 0.60 美元
晚上 10 点 30 分至早上 7 点的夜间费用 - 固定费用为 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
总结一下:
- 如果停车时间超过晚上 10 点 30 分(将收取固定夜间费用),我该如何添加支票
- 如果停车时间超过夜间时间,并且在早上 7 点后到第二天早上,我如何添加检查(前一天的日费率 + 夜间费率 + 第二天的日费率)
最简单的方法是每 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
我正在尝试编写一个停车场收费计算器。提供各种费率: 从早上 7 点到晚上 10.30 - 每 30 分钟 0.60 美元 晚上 10 点 30 分至早上 7 点的夜间费用 - 固定费用为 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
总结一下:
- 如果停车时间超过晚上 10 点 30 分(将收取固定夜间费用),我该如何添加支票
- 如果停车时间超过夜间时间,并且在早上 7 点后到第二天早上,我如何添加检查(前一天的日费率 + 夜间费率 + 第二天的日费率)
最简单的方法是每 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