当前位置:网站首页>freeCodeCamp----time_calculator练习
freeCodeCamp----time_calculator练习
2022-04-23 05:57:00 【Lily的秋天】
目录
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)"
然后,肯定是能通过了。
就很离谱,邪了门了。

版权声明
本文为[Lily的秋天]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_34285232/article/details/121271297
边栏推荐
猜你喜欢
随机推荐
QT add qserialport class to realize serial port operation
Incremental update of client software
WebAPI+Form表单上传文件
.Net Core3.1 使用 RazorEngine.NetCore 制作实体生成器 (MVC网页版)
ASP.NET CORE 配置选项(上篇)
.Net Core 下使用 Quartz —— 【7】作业和触发器之简单触发器
SQLite compilation
算数表达式
VHDL 有限状态机(FSM) 代码示例
.Net Core 下使用 Quartz —— 【5】作业和触发器之触发器的通用属性和优先级
Informatics one book pass - small ball
Unity3D对象池的理解与小例子
Set up a personal blog of jpress
HDU-Memory Control
Router对象、Route对象、声明式导航、编程式导航
VHDL finite state machine (FSM) code example
Detailed explanation and application of PN junction and diode principle
查漏补缺(二)
Mysql中的索引与视图
七牛上传图片(前台JS+后台C#API获取token)








