我们用Scratch编程的时候经常会处理与时间有关的逻辑,比如控制游戏倒计时,计算程序运行时间,让克隆体间隔一定的时间再出现等,一般用到的指令包括下面这些:
除了【等待…秒】和【计时器归零】外,其它几个都是系统定义好的变量,用来直接获取时间数据的,使用非常方便。那么在Python中如何实现这些功能呢?我们需要用到标准库的time模块,它提供了一些与时间相关的函数,帮助我们进行以下操作:
- 获取时间
- 格式化时间
- 暂停程序
一、获取时间
看下面的示例代码:
import time
wday_list = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']
# 获取时间戳
t1 = time.time()
# 将时间戳转换为格式化的时间
t2 = time.localtime(t1)
# 输出时间戳
print(t1)
# 从t2的属性中获取年、月、日、星期、时、分、秒等数据
print('今天是%i年%i月%i日星期%s'%(t2.tm_year,t2.tm_mon,t2.tm_mday,wday_list[t2.tm_wday]))
print('现在时间:%i时%i分%i秒'%(t2.tm_hour, t2.tm_min,t2.tm_sec))
这段代码中,我们先把time()函数的返回值保存到变量t1中,这个返回值是一个时间戳,时间戳是指从1970年1月1日0时0分0秒到你当前运行程序的时间经过的秒数。是不是有点像Scratch中的“计时器”这个变量?但不同的是,Scratch的计时器是从你打开Scratch开始的(除非你使用【重置计时器】,否则它会一直增加)。
由于time()返回的时间戳也是秒数,不容易阅读,所以我们又调用time模块的localtime()函数把t1中保存的时间戳转换成了一个格式化的时间t2,t2具有以下属性:
- tm_year:年
- tm_month:月
- tm_mday:日
- tm_wday:星期,0代表周一,向后依次递增
- tm_hour:时
- tm_min:分
- tm_sec:秒
是不是基本上把Scratch中的那几个跟时间有关的变量都包含了?有了这几个属性,我们再用格式化输出了当前的日期和时间,需要注意的是,由于tm_wday中保存的是0-6的数字,不是星期几这样的字符串,输出时我们用了一个小转换,把它作为列表索引来找到我们定义好的列表中对应的星期几,这样更容易阅读。
程序运行效果如下:
注意,time.localtime()这个函数接收的是一个时间戳类型的参数,你也可以不传递任何参数,它会自动获取当前时间的时间戳并转换,相当于替你调用了time()函数。
二、格式化时间
上面的例子中我们获得了时间,自己调用格式化输出让时间更易阅读,其实time模块提供了现成的函数strftime(),它可以帮助我们很方便地把localtime()函数返回的时间按照指定格式转化为字符串,看这个例子:
import time
now = time.localtime()
t1 = time.strftime('现在时间是:%Y年%m月%d日 %H时%M分%S秒',now)
t2 = time.strftime('%Y-%m-%d %H:%M:%S')
print(t1)
print(t2)
程序运行效果:
这个例子中我们调用了两次time.strftime()函数,第一次传递了两个参数,分别是格式字符串和localtime()函数返回的结构化时间,第二个直接传递了一个格式字符串。你会发现它们输出的时间相同,只是格式不一样。也就是说,第二个参数是可以省略的,默认为当前的时间戳转换的结构化时间。
至于第一个参数,完全是根据我们的需要,像格式化输出一样,把各种变量组合成我们想要的格式,就像我们在t1和t2中组合的那样。到底支持哪些变量呢?参见下表:
格式字符 | 含义 |
---|---|
%d | 表示日期数,取值范围1-31 |
%H | 表示24小时制的小时数,取值范围0-23 |
%I | 表示12小时制的小时数,取值范围1-12 |
%j | 表示一年中的第几天,取值范围1-366 |
%m | 表示月份,取值范围1-12 |
%M | 表示分钟,取值范围0-59 |
%p | AM或PM,即上午或下午 |
%S | 表示秒数,取值范围0-59 |
%w | 表示星期数,取值范围0-6,注意!0为星期日 |
%W | 表示一年中的第几周,取值范围0-53,周一作为一周第一天,在第一周周一之间的时间被认为在第0周 |
%y | 两位年份数,取值范围00-99 |
%Y | 四位年份数 |
%x | 本地化的日期 |
%X | 本地化的时间 |
这个表中有些项很常用,需要记忆,还要注意别写错大小写。
三、“暂停”程序
我们在Scratch中可以使用【等待x秒】暂停程序,time模块提供了sleep()函数可以起到类似的效果。它接收一个数字类型的参数,表示暂停的秒数。看下面这个例子就明白了:
import time
while True:
print(time.strftime('%X'))
time.sleep(1)
这段程序的作用是让程序每隔一秒输出一下当前时间(注意到我使用的“%X”参数了吗?),运行效果如下:
四、课后作业
本节我们主要学习了Python标准库中time模块的用法,包括获取时间戳、获取结构化时间、转换时间为格式化的字符串、暂停程序等。请你使用今天所学知识,完成一个番茄钟:
- 程序运行时输入番茄名称
- 程序倒计时25分钟后,打印出当前的日期、时间及提示信息,例如:现在是2022年9月5日9点10分,你的番茄钟【写英语作业】已经完成,恭喜你!