MicroPython内置模块 time:时间和日期处理
MicroPython的内置模块time是一个用于处理时间相关功能的模块,它实现了CPython模块的一个子集,但也有一些特殊的特点和限制。本文将从以下几个方面介绍time模块的主要特点、应用场景,以及需注意事项,并给出几个实际运用程序案例。
主要特点
- time模块提供了获取当前时间和日期、测量时间间隔、和延迟执行的函数。
- time模块使用的时间纪元(Epoch)是一个固定的起始点,用于计算从该点开始经过的秒数。不同的端口可能使用不同的时间纪元,Unix端口使用1970-01-01 00:00:00 UTC,而一些嵌入式端口使用2000-01-01 00:00:00 UTC。可以通过调用
time.gmtime(0)
来确定端口使用的时间纪元。 - time模块可以将秒数转换为日期时间元组,或者反过来,使用
time.gmtime()
和time.localtime()
函数。日期时间元组包含8个元素,分别是年、月、日、时、分、秒、星期和一年中的第几天。这些函数可以接受一个可选的秒数参数,如果没有提供,则使用来自实时时钟(RTC)的当前时间。 - time模块可以使用
time.sleep()
、time.sleep_ms()
和time.sleep_us()
函数来延迟执行一定的秒数、毫秒数或微秒数。这些函数会阻塞当前线程,直到延迟时间结束或被中断。某些板可能接受浮点数作为参数,以实现更精确的延迟。 - time模块还提供了一些高级函数,用于处理可能环绕的刻度值。刻度值是一个递增的计数器,表示从任意参考点开始经过的毫秒数或微秒数,当达到某个最大值后会重新从零开始。这个最大值称为
TICKS_MAX
,它是一个未公开的常量,但可以通过调用time.ticks_add(0, -1)
来获取。刻度值可以用于测量非常短的时间间隔或实现精确的定时器。
time模块提供了以下几个函数来处理刻度值:
time.ticks_ms()
和time.ticks_us()
分别返回以毫秒或微秒为单位的刻度值。time.ticks_cpu()
返回以系统中尽可能高的分辨率为单位的刻度值,通常是CPU时钟,但也可能是其他高精度定时源。这个函数用于非常精细的基准测试或非常紧凑的实时循环,但并非每个端口都实现了它。time.ticks_add(ticks, delta)
按给定数字偏移刻度值,可以是正数也可以是负数。这个函数可以用于计算事件或任务的截止日期。time.ticks_diff(ticks1, ticks2)
测量两个刻度值之间的差异,作为一个可能环绕的带符号值。这个函数可以用于比较两个刻度值或计算时间间隔。
应用场景
- time模块可以用于获取和设置系统时间和日期,例如在开机时通过网络时间协议(NTP)同步RTC,或者在用户界面中显示当前时间和日期。
- time模块可以用于实现定时器或延时器,例如在循环中等待一定时间后执行某些操作,或者在某些条件满足后触发某些事件。
- time模块可以用于测量代码执行的性能或效率,例如在运行前后记录刻度值并计算差异,或者在循环中使用刻度值控制执行频率。
MicroPython的内置模块time
提供了与时间相关的功能,但在使用时需要注意以下几个事项:
- 时间精度:MicroPython是一种嵌入式系统的解释器,其运行在资源受限的环境中。因此,MicroPython的时间函数的精度可能会受到限制。具体的精度取决于所运行的硬件平台和MicroPython的配置。在实时性要求较高的应用中,建议使用专门的硬件或实时操作系统来处理时间相关的任务。
- 时间戳的表示:MicroPython中的时间戳是一个浮点数,使用 2000-01-01 00:00:00 UTC 的纪元,而不是 1970-01-01 00:00:00 UTC 的 POSIX 系统纪元。需要注意的是,不同的硬件平台和操作系统可能对时间戳的起始点和精度有所不同。在进行时间计算或与其他系统进行时间交互时,应确保对时间戳的解释和转换是一致的。
- 延时函数的准确性:MicroPython的time模块提供了
sleep()
函数用于延时执行代码。但是,由于MicroPython的运行环境受到资源限制和调度机制的影响,延时函数的准确性可能会有一定的偏差。在对时间精度要求较高的应用中,建议使用专门的硬件定时器或实时操作系统提供的延时机制。 - 时区和夏令时:MicroPython的time模块默认使用本地时间。但是,MicroPython的内置时间模块没有提供与时区和夏令时相关的功能。如果需要在MicroPython中处理时区和夏令时,可能需要借助第三方库或手动实现相关功能。
- 时间格式化:MicroPython的time模块提供了
strftime()
函数用于格式化日期和时间。但是,需要注意的是,由于MicroPython的资源受限和内存限制,strftime()
函数的格式选项可能会受到一些限制。在使用格式字符串时,应确保所选的格式是MicroPython支持的,并且不会导致内存溢出或其他问题。
总之,MicroPython的内置模块time提供了基本的时间功能,但在使用时需要注意时间精度、时间戳的表示、延时函数的准确性、时区和夏令时的处理,以及格式化函数的限制。根据具体的应用需求,可能需要考虑使用外部硬件或库来提供更高精度的时间功能和处理复杂的时间相关任务。实际运用程序案例有:
案例一:使用NTP同步RTC并显示当前时间和日期
import network
import ntptime
import time# 连接到WiFi网络sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('SSID', 'PASSWORD')
while not sta_if.isconnected():pass# 使用NTP同步RTCntptime.settime()# 显示当前时间和日期while True:t = time.localtime()print('当前时间是:{}年{}月{}日 {}:{}:{}'.format(t[0], t[1], t[2], t[3], t[4], t[5]))time.sleep(1)
案例二:使用time.sleep()实现一个简单的秒表
import time# 初始化变量start = 0 # 开始时间
stop = 0 # 停止时间
elapsed = 0 # 经过时间
running = False # 是否正在运行# 定义开始函数def started():global start, elapsed, runningif not running:start = time.time() - elapsed # 记录开始时间并减去之前经过的时间running = True # 设置运行标志为真# 定义停止函数def stop():global stop, elapsed, runningif running:stop = time.time() # 记录停止时间elapsed = stop - start # 计算经过时间running = False # 设置运行标志为假# 定义复位函数def reset():global start, stop, elapsed, runningstart = 0 # 重置开始时间为零stop = 0 # 重置停止时间为零elapsed = 0 # 重置经过时间为零running = False # 设置运行标志为假# 定义显示函数def show():global elapsed, runningif running:elapsed = time.time() - start # 更新经过时间print('秒表:{:.2f}秒'.format(elapsed)) # 显示经过时间,保留两位小数# 测试程序started() # 开始秒表
time.sleep(3) # 等待3秒
show() # 显示秒表,应该接近3秒
time.sleep(2) # 等待2秒
stop() # 停止秒表
show() # 显示秒表,应该接近5秒,且不再变化
time.sleep(2) # 等待2秒
started() # 重新开始秒表,从上次停止的地方继续计时
time.sleep(4) # 等待4秒
show() # 显示秒表,应该接近9秒
reset() # 复位秒表
show() # 显示秒表,应该为0秒
案例三:使用time.ticks_ms()和time.ticks_diff()测量LED闪烁的频率
import machine
import time# 创建一个LED对象,连接到引脚2(ESP32板上的内置LED)led = machine.Pin(2, machine.Pin.OUT)# 创建一个计数器变量,用于记录LED闪烁的次数count = 0# 创建一个回调函数,用于在LED状态改变时更新计数器和刻度值,并打印频率信息def callback
案例四:获取当前时间戳:
import time# 获取当前时间戳timestamp = time.time()
print("Current timestamp:", timestamp)
在这个示例中,我们使用time模块的time()函数获取当前时间的时间戳。时间戳是一个浮点数,表示自UNIX纪元(1970年1月1日)以来的秒数。我们使用time.time()函数获取当前时间的时间戳,并打印出来。
案例五:延时执行代码:
import timeprint("Start")# 延时2秒time.sleep(2)print("End")
在这个示例中,我们使用time模块的sleep()
函数来实现延时执行代码。在这里,我们打印"Start",然后使用time.sleep(2)
使程序暂停执行2秒,最后打印"End"。
案例六:格式化日期和时间:
import time# 获取当前时间的结构化时间current_time = time.localtime()# 格式化日期和时间formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", current_time)
print("Formatted time:", formatted_time)
在这个示例中,我们使用time模块的localtime()
函数获取当前时间的结构化时间。然后,使用strftime()
函数将结构化时间格式化为指定的字符串格式。在这里,我们使用"%Y-%m-%d %H:%M:%S"作为格式字符串,表示年-月-日 时:分:秒的格式。最后,我们打印出格式化后的日期和时间字符串。
案例七:获取当前时间戳
import time# 获取当前时间戳timestamp = time.time()# 打印当前时间戳print("当前时间戳:", timestamp)
在这个例子中,我们使用time.time()
函数获取当前的时间戳。时间戳是自 1970 年 1 月 1 日午夜以来经过的秒数。我们将当前时间戳打印出来。
案例八:延时执行代码
import time# 延时执行代码print("开始执行")
time.sleep(2)
print("延时 2 秒后执行")
在这个例子中,我们使用time.sleep()
函数在代码执行过程中添加延时。这里我们使用 time.sleep(2)
来让程序暂停执行 2 秒钟。在延时结束后,打印出 “延时 2 秒后执行”。
案例九:格式化时间戳
import time# 获取当前时间戳
timestamp = time.time()# 格式化时间戳formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp))# 打印格式化后的时间print("格式化后的时间:", formatted_time)
在这个例子中,我们获取当前的时间戳,并使用 time.strftime() 函数将其格式化为指定的日期时间格式。我们使用 %Y-%m-%d %H:%M:%S 格式字符串来表示年、月、日、小时、分钟和秒。使用 time.localtime()
函数将时间戳转换为本地时间。最后,我们打印出格式化后的时间。
time.strftime() 方法
描述
time strftime()
函数用于格式化时间,返回以可读字符串表示的当地时间,格式由参数 format 决定。
语法
strftime()方法语法:
time.strftime(format[, t])
参数
- format – 格式字符串。
- t – 可选的参数 t 是一个 struct_time 对象。
返回值
返回以可读字符串表示的当地时间。
说明
python中时间日期格式化符号:
- %y 两位数的年份表示(00-99)
- %Y 四位数的年份表示(000-9999)
- %m 月份(01-12)
- %d 月内中的一天(0-31)
- %H 24小时制小时数(0-23)
- %I 12小时制小时数(01-12)
- %M 分钟数(00=59)
- %S 秒(00-59)
- %a 本地简化星期名称
- %A 本地完整星期名称
- %b 本地简化的月份名称
- %B 本地完整的月份名称
- %c 本地相应的日期表示和时间表示
- %j 年内的一天(001-366)
- %p 本地A.M.或P.M.的等价符
- %U 一年中的星期数(00-53)星期天为星期的开始
- %w 星期(0-6),星期天为星期的开始
- %W 一年中的星期数(00-53)星期一为星期的开始
- %x 本地相应的日期表示
- %X 本地相应的时间表示
- %Z 当前时区的名称
- %% %号本身
实例
以下实例展示了 strftime() 函数的使用方法:
实例
# -*- coding: UTF-8 -*-from datetime import datetimenow = datetime.now() # current date and timeyear = now.strftime("%Y")
print("year:", year)month = now.strftime("%m")
print("month:", month)day = now.strftime("%d")
print("day:", day)time = now.strftime("%H:%M:%S")
print("time:", time)date_time = now.strftime("%Y-%m-%d, %H:%M:%S")
print("date and time:",date_time)
以上实例输出结果为:
year: 2020
month: 09
day: 25
time: 10:24:28
date and time: 2020-09-25, 10:24:28