大家好,我是 星源,一个正在自学 Python 的 19 岁编程小白 🤓。今天我们一起来学习 时间、datetime 与多线程 !
📌 今日学习内容
👉 “今天我们把 time、datetime、timedelta 全部吃透,再写一个秒表项目!”
✨ 知识点讲解
time 模块
time.time() 函数
Unix 纪元是编程中经常参考的时间:1970 年 1 月 1 日 0 点,即协调世界时(UTC)。time.time() 函数返回自那一刻以来的秒数,是一个浮点值。例如,在交互式环境中输入以下代码:
>>>importtime>>>time.time()1425063955.068649
time.sleep() 函数
如果需要让程序暂停一下,就调用 time.sleep() 函数,并传入希望程序暂停的秒数。在交互式环境中输入以下代码:
>>>importtime>>>foriinrange(3):...print('Tick')...time.sleep(1)...print('Tock')...time.sleep(1)...TickTockTickTockTickTock数字四舍五入
在处理时间时,你会经常遇到小数点后有许多数字的浮点值。可以用 Python 内置的 round() 函数将它们缩短,该函数按照指定的精度四舍五入到一个浮点数。在交互式环境中输入以下代码:
>>>importtime>>>now=time.time()>>>now1425064108.017826>>>round(now, 2)1425064108.02>>>round(now, 4)1425064108.0178>>>round(now)1425064108
项目:超级秒表
需求
完整代码
#! python3# stopwatch.py - A simple stopwatch program.importtime# Display the program's instructions.print('Press ENTER to begin. Afterwards, press ENTER to "click" the stopwatch. Press Ctrl-C to quit.')input() # press Enter to beginprint('Started.')startTime=time.time() # get the first lap's start timelastTime=startTimelapNum=1# Start tracking the lap times.try:whileTrue:input()lapTime=round(time.time() -lastTime, 2)totalTime=round(time.time() -startTime, 2)print('Lap #%s: %s (%s)'% (lapNum, totalTime, lapTime), end='')lapNum+=1lastTime=time.time() # reset the last lap timeexceptKeyboardInterrupt:# Handle the Ctrl-C exception to keep its error message from displaying.print('\nDone.')datetime 模块
timedelta 数据类型
timedelta 表示“一段时间”,而非某个具体时刻。在交互式环境中输入以下代码:
>>>importdatetime>>>delta=datetime.timedelta(days=11, hours=10, minutes=9, seconds=8)>>>delta.days, delta.seconds, delta.microseconds(11, 36548, 0)>>>delta.total_seconds()986948.0>>>str(delta)'11 days, 10:09:08'
暂停直至特定日期
用 while + time.sleep(1) 循环检查 datetime.datetime.now() 是否到达目标日期。示例:
importdatetimeimporttimehalloween2016=datetime.datetime(2016, 10, 31, 0, 0, 0)whiledatetime.datetime.now() <halloween2016:time.sleep(1)
将 datetime 对象转换为字符串
使用 strftime() 方法,支持丰富格式指令:
| 指令 | 含义 |
|---|
| %Y | 带世纪的年份,例如 '2014' |
| %y | 不带世纪的年份,'00' 至 '99' |
| %m | 数字表示的月份,'01' 至 '12' |
| %B | 完整的月份,例如 'November' |
| %b | 简写的月份,例如 'Nov' |
| %d | 一月中的第几天,'01' 至 '31' |
| %j | 一年中的第几天,'001' 至 '366' |
| %w | 一周中的第几天,'0'(周日) 至 '6'(周六) |
| %A | 完整的周几,例如 'Monday' |
| %a | 简写的周几,例如 'Mon' |
| %H | 小时(24 小时时钟),'00' 至 '23' |
| %I | 小时(12 小时时钟),'01' 至 '12' |
| %M | 分,'00' 至 '59' |
| %S | 秒,'00' 至 '59' |
| %p | 'AM' 或 'PM' |
| %% | 就是 '%' 字符 |
代码示例:
>>>importdatetime>>>oct21st=datetime.datetime(2015, 10, 21, 16, 29, 0)>>>oct21st.strftime('%Y/%m/%d %H:%M:%S')'2015/10/21 16:29:00'>>>oct21st.strftime('%I:%M %p')'04:29 PM'>>>oct21st.strftime("It happened on %A, %B %d, %Y")'It happened on Wednesday, October 21, 2015'将字符串转换成 datetime 对象
用 datetime.datetime.strptime(),格式字符串必须与输入字符串完全匹配。示例:
>>>importdatetime>>>datetime.datetime.strptime('October 21, 2015', '%B %d, %Y')datetime.datetime(2015, 10, 21, 0, 0)>>>datetime.datetime.strptime('2015/10/21 16:29:00', '%Y/%m/%d %H:%M:%S')datetime.datetime(2015, 10, 21, 16, 29)速查表
| 函数/方法 | 作用 |
|---|
| time.time() | 返回当前 Unix 纪元时间戳(float) |
| time.sleep(seconds) | 让程序暂停 seconds 秒 |
| datetime.datetime.now() | 返回当前时刻的 datetime 对象 |
| datetime.datetime(year, month, day, hour, minute, second) | 构造指定时刻 |
| datetime.timedelta(...) | 构造一段时间 |
| total_seconds() | timedelta 转秒数 |
| strftime(format) | datetime → 格式化字符串 |
| strptime(time_string, format) | 格式化字符串 → datetime |
✅ 总结
time 模块 只认“秒数”,适合计时、暂停。
datetime 模块 支持日期运算、格式化、解析,功能更高级。
timedelta 可以“日期加减”,再也不用手算闰年。
超级秒表项目 把 time.time()、round()、try/except 用到极致,跑一遍就能背下来。
“速查表”建议打印贴墙,随时翻。
📢 互动提问
👉 用 datetime 算“100 天后是星期几”只用一行,你知道怎么写吗?评论区秀代码!