当前位置:网站首页>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
边栏推荐
猜你喜欢
【ORACLE与mysql的区别】
Redux概述
VHDL 有限状态机(FSM) 代码示例
查漏补缺(六)
todesk远程控制软件的使用
MOS tube characteristics and conduction process
CUDA project encountered a series of compilation problems after changing the environment (computer)
微信小程序之 js 时间戳/1000 转换 秒,六个小时后,一天后,本周五 选项计算时间
.Net Core3.1 使用 RazorEngine.NetCore 制作实体生成器 (MVC网页版)
查漏补缺(三)
随机推荐
.Net Core 下使用 Quartz —— 【3】作业和触发器之作业传参
JS的解析与执行过程
Redux概述
查漏补缺(五)
js获取链接?后边的参数名称或者值,根据url ?后的参数做判断
查漏补缺(三)
.Net Core 下使用 Quartz —— 【1】快速开始
ASP.NET CORE配置选项(下篇)
颜色字符串转换
小米摄像头异常解决
Wildcards and special symbols for shell scripts
赛氪-zeal
Detailed explanation and application principle of token
excel快速自动填充空白单元格上一行的内容
往String原型上封装一个时间戳转日期的方法
Makefile基础、常用函数及通用Makefile
Sdoi2009-hh Necklace
WebSocket(基础)
Error in created hook: “ReferenceError: “Promise”未定义“
VHDL 有限状态机(FSM) 代码示例