python实现停车场计费问题,求助

qq_26555609 2018-02-08 11:43:55
先简单描述一下停车场收费细则:
1、7:00-22:00 4元/小时
22:00-7:00 4元/小时,但最高只收8元
2、超过15分钟开始计费,超过1小时按2小时收取

要实现的功能:
输入进场时间和出场时间,输出缴费金额。

我的最大的问题是如何实现跨天计费?比如2月1日21:30入场,2月2日12:40出场。

求教,年前实在是太忙了,没有时间研究,小领导又急着要
...全文
2573 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38881822 2020-04-30
  • 打赏
  • 举报
回复
大佬这个是什么呀 hour1 = time1.hour hour2 = time2.hour
qq_35714779 2018-02-19
  • 打赏
  • 举报
回复
引用 9 楼 陈年椰子的回复:
我也是刚接触Python , 接触python有半年了。 正在学习中。 多交流,共同进步。 qq 发私信了。
你好可以交流下吗,我也是学一段时间了,393376780 qq
陈年椰子 2018-02-11
  • 打赏
  • 举报
回复
我也是刚接触Python , 接触python有半年了。 正在学习中。 多交流,共同进步。 qq 发私信了。
qq_26555609 2018-02-11
  • 打赏
  • 举报
回复
引用 7 楼 seakingx 的回复:

# coding=UTF-8
import time
import datetime
import math
#把字符串转成datetime
def string_toDatetime(string):
    return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")

def string_toTimestamp(strTime):
    return time.mktime(string_toDatetime(strTime).timetuple())


def Fee(time1,time2,flag):
    times = time2 - time1
    days = times.days
    hours = days * 24 + times.seconds / 3600.00
    fee_hours = int(math.ceil(hours))
    fee_hours = fee_hours
    hour1 = time1.hour
    hour2 = time2.hour
    fee = 0
    # 如果flag = 1 表示第二日时间段,没有免费15分钟。
    if hours >= 0.25 or flag == 1:
        # 大于15分钟
        d_fee = 0
        n_fee = 0
        # 计算费用
        time_i = time1
        while time_i < time2:
            hour_i = time_i.hour
            if hour_i >= 7 and hour_i < 22:
                d_fee = d_fee + 4
            if hour_i < 7 or hour_i >= 22:
                n_fee = n_fee + 4
            time_i = time_i + datetime.timedelta(hours=1)

        if n_fee > 8:
            n_fee = 8
        fee = d_fee + n_fee

        print " %s-%s 停车%s小时,收费%d小时,日间%d元, 夜间%d元, 停车费:%d元" % (time1,time2,hours, fee_hours, d_fee, n_fee,   fee)
    else:
        print "免费"
    return fee


def check_fee(time1,time2,flag):
    timei = time1
    if (timei < time2):
        # 以7点为节点,递归计算
        timei_next = string_toDatetime((timei + datetime.timedelta(days=1)).strftime("%Y-%m-%d") + " 07:00:00")
        if timei_next < time2:
            park_fee = Fee(time1, timei_next+ datetime.timedelta(seconds=-1), flag)+check_fee(timei_next,time2,1)
        else:
            park_fee = Fee(time1, time2, 0)

        return park_fee
    else:
        return 0

time_in = "2018-01-02 16:20:00"
time_out = "2018-01-03 08:30:00"
time1 =  string_toDatetime(time_in)
time2 = string_toDatetime(time_out)

# 递归计算车费
park_fee = check_fee(time1,time2,0)

print "停车费总计:%d元" % park_fee





验证了一下,应该是符合计算规则了 你自己把 print xxx 改成 print(xxx)
老哥你是真的强,方便加个qq啥的吗 我现在在自学python,想跟您请教一下
qq_26555609 2018-02-10
  • 打赏
  • 举报
回复
引用 2 楼 seakingx 的回复:

# coding=UTF-8
import time
import datetime
import math
#把字符串转成datetime
def string_toDatetime(string):
    return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")

def string_toTimestamp(strTime):
    return time.mktime(string_toDatetime(strTime).timetuple())


time_in = "2018-02-01 21:30:00"
time_out = "2018-02-04 12:40:00"
time1 =  string_toDatetime(time_in)
time2 = string_toDatetime(time_out)
times = time2 - time1
days = times.days
hours = days*24 + times.seconds/3600.00
fee_hours = int(math.ceil(hours))
fee_hours = fee_hours
# print hours,fee_hours
hour1 = time1.hour
hour2 = time2.hour
if fee_hours-hours > 0 :
    hour2 = hour2 +1
# print "停车时间 " , hour1,hour2 , hours
if hours>=0.25 :
    # 大于15分钟
    fee = 0
    d_fee = 0
    n_fee = 0
    n_fee_days = 0
    day_i = 0
    # 计算费用
    hour_i = hour1
    for i in range(fee_hours):
        if  hour_i>=7 and hour_i<22 :
            d_fee = d_fee + 4
        if hour_i<7 :
            n_fee = n_fee + 4
        if hour_i>=22 :
            n_fee = n_fee + 4
        hour_i = hour_i+1
        if hour_i == 24:
            hour_i = 0
        if hour_i == 7 :
            # 判断过夜费优惠。处理多夜停车
            if n_fee>0 :
                if n_fee >8:
                    n_fee_days = n_fee_days+8
                else:
                    n_fee_days = n_fee_days+n_fee
                n_fee = 0

    # print n_fee_days,d_fee,n_fee
    if n_fee >8 :
        n_fee = 8
    fee = d_fee + n_fee+n_fee_days

    # print time1.hour , time2.hour
    print "停车%s小时,收费%d小时,日间%d元, 夜间%d元,多夜间%d元,停车费:%d元" %(hours,fee_hours,d_fee, n_fee,n_fee_days,fee)
else:
    print "免费"


考虑了多时段停车, 即跨了几个夜间停车的情况。 不知道有没有没考虑到的情况。
第62行报错 invalid syntax
qq_26555609 2018-02-10
  • 打赏
  • 举报
回复
第62行报错 invalid syntax
陈年椰子 2018-02-10
  • 打赏
  • 举报
回复

# coding=UTF-8
import time
import datetime
import math
#把字符串转成datetime
def string_toDatetime(string):
    return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")

def string_toTimestamp(strTime):
    return time.mktime(string_toDatetime(strTime).timetuple())


def Fee(time1,time2,flag):
    times = time2 - time1
    days = times.days
    hours = days * 24 + times.seconds / 3600.00
    fee_hours = int(math.ceil(hours))
    fee_hours = fee_hours
    hour1 = time1.hour
    hour2 = time2.hour
    fee = 0
    # 如果flag = 1 表示第二日时间段,没有免费15分钟。
    if hours >= 0.25 or flag == 1:
        # 大于15分钟
        d_fee = 0
        n_fee = 0
        # 计算费用
        time_i = time1
        while time_i < time2:
            hour_i = time_i.hour
            if hour_i >= 7 and hour_i < 22:
                d_fee = d_fee + 4
            if hour_i < 7 or hour_i >= 22:
                n_fee = n_fee + 4
            time_i = time_i + datetime.timedelta(hours=1)

        if n_fee > 8:
            n_fee = 8
        fee = d_fee + n_fee

        print " %s-%s 停车%s小时,收费%d小时,日间%d元, 夜间%d元, 停车费:%d元" % (time1,time2,hours, fee_hours, d_fee, n_fee,   fee)
    else:
        print "免费"
    return fee


def check_fee(time1,time2,flag):
    timei = time1
    if (timei < time2):
        # 以7点为节点,递归计算
        timei_next = string_toDatetime((timei + datetime.timedelta(days=1)).strftime("%Y-%m-%d") + " 07:00:00")
        if timei_next < time2:
            park_fee = Fee(time1, timei_next+ datetime.timedelta(seconds=-1), flag)+check_fee(timei_next,time2,1)
        else:
            park_fee = Fee(time1, time2, 0)

        return park_fee
    else:
        return 0

time_in = "2018-01-02 16:20:00"
time_out = "2018-01-03 08:30:00"
time1 =  string_toDatetime(time_in)
time2 = string_toDatetime(time_out)

# 递归计算车费
park_fee = check_fee(time1,time2,0)

print "停车费总计:%d元" % park_fee





验证了一下,应该是符合计算规则了 你自己把 print xxx 改成 print(xxx)
qq_26555609 2018-02-10
  • 打赏
  • 举报
回复
引用 5 楼 seakingx 的回复:
如果是 python 3.0 改成

print("停车%s小时,收费%d小时,日间%d元, 夜间%d元,多夜间%d元,停车费:%d元" %(hours,fee_hours,d_fee, n_fee,n_fee_days,fee))
else:
    print ("免费")
引用 5 楼 seakingx 的回复:
如果是 python 3.0 改成

print("停车%s小时,收费%d小时,日间%d元, 夜间%d元,多夜间%d元,停车费:%d元" %(hours,fee_hours,d_fee, n_fee,n_fee_days,fee))
else:
    print ("免费")
可以了,我测试了一下: 入场时间01-02 16:20 出场时间01-03 8:20 输出的结果是36元,但按我们停车场的算法是40元。因为早上计时是从7:00开始计,那8:20出场的话就代表从7:00开始,他停了1小时20分钟,那就应该是8元。 意思就是只要停车超过第二天早上7点,就以7点为时间节点开始计时,我不知道我这样说您能理解吗。 很感谢您帮我写这段代码,感激不尽
陈年椰子 2018-02-10
  • 打赏
  • 举报
回复
如果是 python 3.0 改成

print("停车%s小时,收费%d小时,日间%d元, 夜间%d元,多夜间%d元,停车费:%d元" %(hours,fee_hours,d_fee, n_fee,n_fee_days,fee))
else:
    print ("免费")
陈年椰子 2018-02-09
  • 打赏
  • 举报
回复

# coding=UTF-8
import time
import datetime
import math
#把字符串转成datetime
def string_toDatetime(string):
    return datetime.datetime.strptime(string, "%Y-%m-%d %H:%M:%S")

def string_toTimestamp(strTime):
    return time.mktime(string_toDatetime(strTime).timetuple())


time_in = "2018-02-01 21:30:00"
time_out = "2018-02-04 12:40:00"
time1 =  string_toDatetime(time_in)
time2 = string_toDatetime(time_out)
times = time2 - time1
days = times.days
hours = days*24 + times.seconds/3600.00
fee_hours = int(math.ceil(hours))
fee_hours = fee_hours
# print hours,fee_hours
hour1 = time1.hour
hour2 = time2.hour
if fee_hours-hours > 0 :
    hour2 = hour2 +1
# print "停车时间 " , hour1,hour2 , hours
if hours>=0.25 :
    # 大于15分钟
    fee = 0
    d_fee = 0
    n_fee = 0
    n_fee_days = 0
    day_i = 0
    # 计算费用
    hour_i = hour1
    for i in range(fee_hours):
        if  hour_i>=7 and hour_i<22 :
            d_fee = d_fee + 4
        if hour_i<7 :
            n_fee = n_fee + 4
        if hour_i>=22 :
            n_fee = n_fee + 4
        hour_i = hour_i+1
        if hour_i == 24:
            hour_i = 0
        if hour_i == 7 :
            # 判断过夜费优惠。处理多夜停车
            if n_fee>0 :
                if n_fee >8:
                    n_fee_days = n_fee_days+8
                else:
                    n_fee_days = n_fee_days+n_fee
                n_fee = 0

    # print n_fee_days,d_fee,n_fee
    if n_fee >8 :
        n_fee = 8
    fee = d_fee + n_fee+n_fee_days

    # print time1.hour , time2.hour
    print "停车%s小时,收费%d小时,日间%d元, 夜间%d元,多夜间%d元,停车费:%d元" %(hours,fee_hours,d_fee, n_fee,n_fee_days,fee)
else:
    print "免费"


考虑了多时段停车, 即跨了几个夜间停车的情况。 不知道有没有没考虑到的情况。
混沌鳄鱼 2018-02-09
  • 打赏
  • 举报
回复

>>> import datetime
>>> dt1 = datetime.datetime.strptime('2018-2-1 21:30:00', '%Y-%m-%d %H:%M:%S')
>>> dt2 = datetime.datetime.strptime('2018-2-2 12:40:00', '%Y-%m-%d %H:%M:%S')
>>> delta = dt2-dt1
>>> delta.seconds/3600
15.166666666666666

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧