时间字符串的简单处理,可自行解析也可以调库。
(笔记模板由python脚本于2024年10月10日 18:06:42创建,本篇笔记适合有基本编程逻辑的coder翻阅)
-
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
本文质量分:
本文地址: https://blog.csdn.net/m0_57158496/article/details/142828707
CSDN质量分查询入口:http://www.csdn.net/qc
- ◆ 候机时间计算
- 1、题目描述
- 2、简单解题
- 3、完善算法
- 4、代码优化
- 5、timedate库对代码精炼
- 6、结论
◆ 候机时间计算
1、题目描述
题目描述截屏图片
【题目来源于 CSDN 问答社区提问“问题标题”】
2、简单解题
题目没有限制输入时间格式,本脚本作输入格式限制:hh:mm:ss(对8:19:9
容错,可以接受不补零占位的输入)。
考虑到是大一新生学习,先不建议直接调用时间处理库,直接“手动”解析字符串输入。
根据题目描述我的代码采取简单逻辑: 输入两个时间字符串,求正差(即候机时间);数学计算得先将“字符串数值化”(即转整int);差值转回字符串常规时间输出(可以格式化去除前导0时0分的输出)。
详细代码
#!/sur/bin/nve python3
# coding: utf-8
# 题目没有限制输入时间格式,本脚本作输入格式限制:hh:mm:ss
# 考虑到是大一新生学习,不直接调用时间处理库,直接解析字符串输入
def time_to_s(s: str) -> int:
'''
解析字符串格式化时间
返回时间秒整数
'''
# 请确保正确输入,本代码不调输入验证模块
h, m, s = map(int, s.split(':')) # 拆分时分秒并转int
return s + m*60 + h*60**2 # 计算并返回秒整数
def main() -> None:
''' 主程序 '''
s = input(f"\n\n飞机起飞时间:").strip() # 接收键盘输入并去除前后空格
arto_time = time_to_s(s)
s = input(f"\n\n到达机场时间:").strip() # 接收键盘输入并去除前后空格
arrival_time = time_to_s(s)
D_value = arto_time - arrival_time
# 时间还原时分秒
h = D_value // (60*60)
D_value -= h*60*60 # 更新时间差秒
m = D_value // 60
D_value -= m*60 # 更新时间差秒
# 格式化输出
str_D = f"{h}时{m}分{D_value}秒" if h and m else f"{m}分{D_value}秒" if m else f"{D_value}秒"
print(f"\n\n{f' 候机时间:{str_D} ':-^30}\n\n")
if __name__ == '__main__':
main() # 直接运行本脚本执行main
代码运行效果截屏展示
(这两个示例仅作代码功能展示,这合事实😋)
代码解读
3、完善算法
我的代码没有错误校验和对跨越一天的两个时间的处理能力,得增添“模块”。
修正跨越零点的两个时间产生的负时差
def out_day(D_value: int) -> int:
''' 跨越一天时间处理 '''
return 24*60*60 + D_value
时间格式校验
def time_split(s: str) -> (int, int, int):
''' 解析字符串格式化时间 '''
try:
h, m, s = map(int, s.split(':')) # 拆分时分秒并转int
except ValueError as e:
raise ValueError(f"{' 时间格式错误 ':-^36}\n\n解释器异常提示:{e}")
return h, m, s
时间数字校验
def is_time(time: str) -> bool:
''' 时间格式校验 '''
h, m, s = time_split(time)
if not 0 <= h < 24:
raise ValueError(f"{' 小时数错误 ':-^37}\n\n解释器异常提示:{e}")
if not 0 <= m < 60:
raise ValueError(f"{' 分钟数错误 ':-^37}\n\n解释器异常提示:{e}")
if not 0 <= s < 60:
raise ValueError(f"{' 秒数错误 ':-^38}\n\n解释器异常提示:{e}")
return True
完整脚本
#!/sur/bin/nve python3
# coding: utf-8
# 题目没有限制输入时间格式,本脚本作输入格式限制:hh:mm:ss
# 考虑到是大一新生学习,不直接调用时间处理库,直接解析字符串输入
def time_to_s(h: int, m: int, s: int) -> int:
''' 时分秒化秒 '''
return s + m*60 + h*60**2
def time_split(s: str) -> (int, int, int):
''' 解析字符串格式化时间 '''
try:
h, m, s = map(int, s.split(':')) # 拆分时分秒并转int
except ValueError as e:
raise ValueError(f"{' 时间格式错误 ':-^36}\n\n解释器异常提示:{e}")
return h, m, s
def is_time(time: str) -> bool:
''' 时间格式校验 '''
h, m, s = time_split(time)
if not 0 <= h < 24:
raise ValueError(f"{' 小时数错误 ':-^37}\n\n解释器异常提示:{e}")
if not 0 <= m < 60:
raise ValueError(f"{' 分钟数错误 ':-^37}\n\n解释器异常提示:{e}")
if not 0 <= s < 60:
raise ValueError(f"{' 秒数错误 ':-^38}\n\n解释器异常提示:{e}")
return True
def out_day(D_value: int) -> int:
''' 跨越一天时间处理 '''
return 24*60*60 + D_value
def main() -> None:
''' 主程序 '''
s = input(f"\n\n飞机起飞时间:").strip() # 接收键盘输入并去除前后空格
is_time(s)
arto_time = time_to_s(*time_split(s))
s = input(f"\n\n到达机场时间:").strip() # 接收键盘输入并去除前后空格
is_time(s)
arrival_time = time_to_s(*time_split(s))
D_value = arto_time - arrival_time
if D_value < 0:
D_value = out_day(D_value)
# 时间还原时分秒
h = D_value // (60*60)
D_value -= h*60*60 # 更新时间差秒
m = D_value // 60
D_value -= m*60 # 更新时间差秒
# 格式化输出
str_D = f"{h}时{m}分{D_value}秒" if h and m else f"{m}分{D_value}秒" if m else f"{D_value}秒"
print(f"\n\n{f' 候机时间:{str_D} ':-^30}\n\n")
if __name__ == '__main__':
try:
main() # 直接运行本脚本执行main
except ValueError as e:
print(f"\n\n{e}\n\n")
4、代码优化
#!/sur/bin/nve python3
# coding: utf-8
'''
题目没有限制输入时间格式,本脚本作输入格式限制:hh:mm:ss。
考虑到是大一新生学习,不直接调用时间处理库,直接解析字符串输入。
'''
def time_to_s(time: str) -> int:
''' 时间格式校验 '''
try:
h, m, s = map(int, time.split(':')) # 拆分时分秒并转int
except ValueError as e:
raise ValueError(f"{' 时间格式错误 ':-^36}\n\n解释器异常提示:{e}")
# 时间数字校验 #
if not 0 <= h < 24:
raise ValueError(f"{' 小时数错误 ':-^37}\n\n")
if not 0 <= m < 60:
raise ValueError(f"{' 分钟数错误 ':-^37}\n\n")
if not 0 <= s < 60:
raise ValueError(f"{' 秒数错误 ':-^38}\n\n")
return s + m*60 + h*60**2
def inputer(tip: str) -> str:
''' 键盘输入 '''
return input(f"\n\n{tip}时间:").strip() # 接收键盘输入并去除前后空格
def main() -> None:
''' 主程序 '''
SECONDS_IN_A_DAY = 24*60**2
arto_time = time_to_s(inputer('飞机起飞'))
arrival_time = time_to_s(inputer('到达机场'))
D_value = arto_time - arrival_time
D_value = SECONDS_IN_A_DAY + D_value if D_value < 0 else D_value
# 时间还原时分秒
h = D_value // (60*60)
D_value -= h*60*60 # 更新时间差秒
m = D_value // 60
D_value -= m*60 # 更新时间差秒
# 格式化输出
str_D = f"{h}时{m}分{D_value}秒" if h and m else f"{m}分{D_value}秒" if m else f"{D_value}秒"
print(f"\n\n{f' 候机时间:{str_D} ':-^30}\n\n")
代码逻辑导读:
1. 脚本概述
本脚本旨在帮助用户计算从到达机场到飞机起飞的候机时间。脚本不依赖于时间处理库,而是通过解析用户输入的字符串来计算时间差。
2. 函数介绍
time_to_s(time: str) -> int
:- 功能:将用户输入的 hh:mm:ss 格式的时间字符串转换为总秒数。
- 逻辑:首先尝试将字符串拆分为小时、分钟和秒,并转换为整数。然后,对小时、分钟和秒进行范围校验,确保它们在合理的范围内。最后,将时间转换为总秒数。
inputer(tip: str) -> str
:- 功能:提示用户输入时间,并返回用户输入的时间字符串。
- 逻辑:显示提示信息,接收用户输入,并去除输入字符串的前后空格。
main() -> None
:- 功能:脚本的主函数,负责调用其他函数并输出最终的候机时间。
- 逻辑:定义一天的总秒数常量,获取飞机起飞时间和到达机场时间,计算时间差。如果时间差为负数,表示跨越了一天,因此需要加上一天的总秒数。然后将时间差还原为时分秒格式,并格式化输出。
3. 异常处理
脚本在处理用户输入和时间转换时可能会遇到 ValueError
。为了确保用户能够得到清晰的错误信息,脚本在捕获到异常时会抛出一个包含详细错误信息的 ValueError
。
4. 执行流程
- 脚本启动时,会检查是否作为主程序运行。
- 如果是主程序,则执行
main
函数。 - 在
main
函数中,依次调用inputer
函数获取用户输入,time_to_s
函数将输入转换为秒数,计算时间差,并输出结果。 - 如果在执行过程中遇到
ValueError
,脚本会捕获异常并打印错误信息。
5、timedate库对代码精炼
#!/sur/bin/nve python3
from datetime import datetime, timedelta
def inputer(tip: str) -> datetime:
''' 键盘输入 '''
time = input(f"\n\n{tip}时间:").strip() # 接收键盘输入并去除前后空格
try:
return datetime.strptime(time, '%H:%M:%S').time() # 返回datetime对象,datetime自有时间格式验证和时间数字校验,不用特意去写
except ValueError as e:
raise ValueError(f"{' 时间格式错误 ':-^36}\n\n解释器异常提示:\n{e}")
def main() -> None:
''' 主程序 '''
arto_time = inputer('飞机起飞')
arrival_time = inputer('到达机场')
today_date = datetime.today().date()
# 用当前年月日创建两个完整datetime对象方便求差
time_difference = datetime.combine(today_date, arto_time) - datetime.combine(today_date, arrival_time)
# 时间差为负,意味着两个时间跨越零点,需要修正
time_difference = time_difference + timedelta(days=1) if time_difference.total_seconds() < 0 else time_difference
h, m, s = map(int, str(time_difference).split(':'))
out_str = f"{h}时{m}分{s}秒" if h and m else f"{m}分{s}秒" if m else f"{s}秒"
print(f"\n\n{f' 候机时间:{out_str} ':-^34}\n\n") # datetime对象不用特意格式化,它本身就是时间
if __name__ == '__main__':
try:
main() # 直接运行本脚本执行main
except ValueError as e:
print(f"\n\n{e}\n\n")
输出还一样
代码导读
脚本概述
本脚本用于计算用户从到达机场到飞机起飞之间的候机时间。它通过接收用户输入的起飞时间和到达时间,计算两者之间的时间差,并以易读的格式输出结果。脚本使用了Python内置的datetime
模块来处理时间数据。
模块导入
datetime
: 导入用于处理日期和时间的类和方法。timedelta
: 导入用于表示两个日期或时间之间差异的类。
函数定义
inputer(tip: str) -> datetime.time
- 功能:提示用户输入时间,并验证输入格式。
- 参数:
tip
- 一个字符串,用于指示用户正在输入的时间类型(例如,‘飞机起飞’或’到达机场’)。 - 操作:
- 使用
input()
函数接收用户输入,并使用strip()
移除前后空格。 - 使用
datetime.strptime()
将输入的时间字符串转换为datetime.time
对象。 - 如果输入格式不正确,抛出并封装
ValueError
异常,提供错误信息和解释器异常提示。
- 使用
- 返回:一个
datetime.time
对象。
main() -> None
- 功能:执行脚本的主要逻辑,计算并输出候机时间。
- 操作:
- 调用
inputer()
函数获取起飞时间和到达时间。 - 使用
datetime.combine()
结合当前日期和时间,创建两个datetime
对象。 - 计算两个时间对象之间的差异。
- 如果时间差为负,表示时间跨越了午夜,因此需要通过添加
timedelta(days=1)
来修正。 - 使用
map()
和split()
将时间差转换为小时、分钟和秒。 - 根据时间差的存在情况,构造并输出格式化的时间字符串。
- 调用
异常处理
- 在
if __name__ == '__main__':
块中,脚本尝试执行main()
函数。 - 如果在执行过程中捕获到
ValueError
异常,脚本将打印出异常信息。
用户交互
- 用户被提示输入起飞时间和到达时间,输入必须符合
HH:MM:SS
格式。 - 如果输入格式不正确,脚本将显示错误信息并终止执行。
输出格式
- 脚本以居中对齐的格式输出候机时间,格式美观且易于阅读。
6、结论
对任何问题的解决,都可以由简易始,逐步完善和精炼。这是一个较好的“处事”哲学!
上一篇: Python中优秀的“包”(包目录结构易于构建和管理,代码缩进层级变浅,方便维护和功能拓展)
下一篇:
我的HOT博:
本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有
7
7
7篇。
-
001
标题:让QQ群昵称色变的神奇代码
(浏览阅读 5.9w )
地址:https://blog.csdn.net/m0_57158496/article/details/122566500
点赞:25 收藏:86 评论:17
摘要:让QQ昵称色变的神奇代码。
首发:2022-01-18 19:15:08
最后编辑:2022-01-20 07:56:47 -
002
标题:Python列表(list)反序(降序)的7种实现方式
(浏览阅读 1.1w )
地址:https://blog.csdn.net/m0_57158496/article/details/128271700
点赞:8 收藏:35 评论:8
摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
首发:2022-12-11 23:54:15
最后编辑:2023-03-20 18:13:55 -
003
标题:pandas 数据类型之 DataFrame
(浏览阅读 9.7k )
地址:https://blog.csdn.net/m0_57158496/article/details/124525814
点赞:7 收藏:36
摘要:pandas 数据类型之 DataFrame_panda dataframe。
首发:2022-05-01 13:20:17
最后编辑:2022-05-08 08:46:13 -
004
标题:个人信息提取(字符串)
(浏览阅读 8.2k )
地址:https://blog.csdn.net/m0_57158496/article/details/124244618
点赞:2 收藏:15
摘要:个人信息提取(字符串)_个人信息提取python。
首发:2022-04-18 11:07:12
最后编辑:2022-04-20 13:17:54 -
005
标题:Python字符串居中显示
(浏览阅读 7.6k )
地址:https://blog.csdn.net/m0_57158496/article/details/122163023
评论:1 -
006
标题:罗马数字转换器|罗马数字生成器
(浏览阅读 7.5k )
地址:https://blog.csdn.net/m0_57158496/article/details/122592047
摘要:罗马数字转换器|生成器。
首发:2022-01-19 23:26:42
最后编辑:2022-01-21 18:37:46 -
007
标题:回车符、换行符和回车换行符
(浏览阅读 6.0k )
地址:https://blog.csdn.net/m0_57158496/article/details/123109488
点赞:2 收藏:3
摘要:回车符、换行符和回车换行符_命令行回车符。
首发:2022-02-24 13:10:02
最后编辑:2022-02-25 20:07:40
截屏图片
(此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
◆ Python 入门指南【Python 3.6.3】
好文力荐:
- 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
- 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
- 靠谱程序员的好习惯
- 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)