freeCodeCamp----time_calculator练习

目录

1 题目要求

2 示例说明

3 流程分析

 4 源码

5 易错点

 6 疑惑点


1 题目要求

给定一个原始时间,一个持续时间,两者相加后以12小时制显示,要求后缀有上午或者下午、周显示、几天后显示等。

2 示例说明

add_time("3:00 PM", "3:10")
# Returns: 6:10 PM

add_time("11:30 AM", "2:32", "Monday")
# Returns: 2:02 PM, Monday

add_time("11:43 AM", "00:20")
# Returns: 12:03 PM

add_time("10:10 PM", "3:30")
# Returns: 1:40 AM (next day)

add_time("11:43 PM", "24:20", "tueSday")
# Returns: 12:03 AM, Thursday (2 days later)

add_time("6:30 PM", "205:12")
# Returns: 7:42 AM (9 days later)

3 流程分析

做了一个简单的流程图,如下,基本解释了从参数传入开始数据的处理过程。

 4 源码

不多说,直接附上,流程解释的很清楚。

import re
def add_time(start, duration, day = None):
    # 先拆分各数据
    aday = re.findall(r'AM|PM', start)

    # 按时、分存入数组中
    orginal_time = re.findall(r'\d+', start)
    time_plus = re.findall(r'\d+', duration)

    # 先判断原时间是AM还是PM,若是PM,原小时要加12再后续计算
    if 'PM' in aday:
      orginal_time[0] = str(int(orginal_time[0]) + 12)

    # 时分先分别做相加
    # print(orginal_time)
    new_hour = int(orginal_time[0]) + int(time_plus[0])
    new_min = int(orginal_time[1]) + int(time_plus[1])

    # 先判断分钟数
    # 先判断是否大于59
    # 注意需要先取整,加到new_hour上,顺序错了会报错,因为new_min被重新赋值了
    if new_min > 59:
      new_hour += int(new_min/60)
      new_min = new_min%60
    # print('new_hour:'+str(new_hour))
    # print('new_min:'+str(new_min))
    # 小于10,在前面加0
    if new_min < 10:
      new_min = '0' + str(new_min)

    new_day = 0
    if new_hour > 23:
      new_day = int(new_hour/24)
      new_hour = new_hour%24
      if new_hour < 12:
        aday[0] = 'AM'
      if new_hour == 12:
        aday[0] = 'PM'
      else:
        if new_hour > 12:
          new_hour -= 12;
          aday[0] = 'PM'
    else:
      if new_hour < 12:
        aday[0] = 'AM'
      if new_hour == 12:
        aday[0] = 'PM'
      else:
        if new_hour > 12:
          new_hour -= 12;
          aday[0] = 'PM'

    # print(new_hour)
    # print(new_min)
    new_time = str(new_hour) + ':' + str(new_min) + ' ' + aday[0]

    # 若第二个参数不为空,判断是几天后,并计算周几
    new_day_out = ''
    if new_day == 1:
      new_day_out = ' (next day)'
    if new_day >= 2:
      new_day_out = ' (' + str(new_day) + ' days later' + ')'

    week = ['monday','tuesday','wednesday','thurday','friday','saturday','sunday']
    # 判断day的值是否在week里面,注意不区分大小写,因为day的值可能是大小写混着
    # 这里用了小技巧,将day全部转换成小写再判断,输出的时候再将首字母大写即可
    if day:
      if day.lower() in week: 
      # 找出索引
        location = week.index(day.lower())
        temp = location + new_day
        if(temp > 6):
          temp = int(temp%7)
          new_day_out = ', ' + week[temp-7].title() + new_day_out
        else:
          new_day_out = ', ' + week[temp].title() + new_day_out

    new_out = new_time + new_day_out

    return new_out

5 易错点

1.要先判断原始时间是AM还是PM,PM要在小时数上加12;

2.注意当小时数和分钟数小于10时,分钟需要前面补0,小时数不用;

3.输出时的各种标点符号,空格、逗号、括号,特别是最后的空格,看不见,容易忽略;

4.一周就7天,当相加后的时间在7天后,要注意提取周几的时候索引会超出范围报错,需要多加一步判断;

 6 疑惑点

给定的测试用例中,第四条用例如下: 

def test_period_change_at_twelve(self):
        actual = add_time("11:40 AM", "0:25")
        expected = "12:05 PM"
        self.assertEqual(actual, expected, 'Expected period to change from AM to PM at 12:00')

给出的解释是: 'Expected period to change from AM to PM at 12:00',也就是说当超过12点时,需要将AM换成PM,并且它的期望输出是:12:05 PM 。

但到了倒数第二个用例时,如下:

def test_two_days_later_with_day(self):
        actual = add_time("11:59 PM", "24:05", "Wednesday")
        expected = "12:04 AM, Friday (2 days later)"
        self.assertEqual(actual, expected, 'Expected calling "add_time()" with "11:59 PM", "24:05", "Wednesday" to return "12:04 AM, Friday (2 days later)"')

给出的期望输出却是:12:04 AM,这显然和上一条用例时矛盾的,或者是我的理解有误,这两条用例不能同时通过,于是我将下面这条的期望输出改成了如下:

expected = "0:04 AM, Friday (2 days later)"

然后,肯定是能通过了。 

就很离谱,邪了门了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值