当前位置:   article > 正文

详解 Python 中与时间有关的函数_python 检查时间的函数

python 检查时间的函数

目录

15.1 time 模块

15.1.1 time.time()函数

15.1.2 time.sleep()函数

15.2 datetime 模块

15.4.1 timedelta 数据类型

15.4.2 暂停直至特定日期

 15.4.3 将 datetime 对象转换为字符串

15.4.4 将字符串转换成 datetime 对象

15.6 多线程


坐在电脑前运行程序是不错的,但在你没有直接监督时运行程序,也是有用的。计算机的时钟可以调度程序,在特定的
时间和日期运行,或定期运行。例如,程序可以每小时抓取一个网站,检查变更,或在凌晨 4 点你睡觉时,执行 CPU 密集
型任务。 Python 的 time 和 datetime 模块提供了这些函数。利用 subprocess 和 threading 模块,你也可以编程按时启动其他程序。通常,编程最快的方法是利用其他人已经写好的应用程序。

15.1 time 模块

计算机的系统时钟设置为特定的日期、时间和时区。内置的 time 模块让 Python程序能读取系统时钟的当前时间。在 time 模块中, time.time()和 time.sleep()函数是最有用的模块。


15.1.1 time.time()函数

Unix 纪元是编程中经常参考的时间: 1970 年 1 月 1 日 0 点,即协调世界时(UTC)。 time.time()函数返回自那一刻以来的秒数,是一个浮点值(回想一下,浮点值只是一个带小数点的数)。这个数字称为 UNIX 纪元时间戳。

15.1.2 time.sleep()函数

如果需要让程序暂停一下,就调用 time.sleep()函数,并传入希望程序暂停的秒数。

time.sleep()函数将阻塞(也就是说,它不会返回或让程序执行其他代码),直到传递给 time.sleep()的秒数流逝。

15.2 datetime 模块

time 模块用于取得 Unix 纪元时间戳,并加以处理。但是,如果以更方便的格式显示日期,或对日期进行算术运算(例如,搞清楚 205 天前是什么日期,或 123天后是什么日期),就应该使用 datetime 模块。

datetime 模块有自己的 datetime 数据类型。 datetime 值表示一个特定的时刻。 在交互式环境中输入以下代码:

调用 datetime.datetime.now()返回一个 datetime 对象,表示当前的日期和时间,根据你的计算机的时钟。这个对象包含当前时刻的年、月、日、时、分、秒和微秒。也可以利用 datetime.datetime()函数,向它传入代表年、月、日、时、分、秒的整数,得到特定时刻的 datetime 对象。这些整数将保存在 datetime 对象的 year、month、 day、 hour、 minute 和 second属性中。

Unix 纪元时间戳可以通过 datetime.datetime.fromtimestamp(),转换为 datetime对象。 datetime 对象的日期和时间将根据本地时区转换。

15.4.1 timedelta 数据类型

datetime 模块还提供了 timedelta 数据类型,它表示一段时间,而不是一个时刻。算术运算符可以用于对 datetime 值进行日期运算。例如,要计算今天之后 1000天的日期,在交互式环境中输入以下代码:
首先,生成表示当前时刻的 datetime 对象,保存在 dt 中。然后生成一个 timedelta对象,表示 1000 天,保存在 thousandDays 中。 dt 与 thousandDays 相加,得到一个datetime 对象,表示现在之后的 1000 天。 Python 将完成日期运算,弄清楚 2015 年
2 月 27 日之后的 1000 天,将是 2017 年 11 月 23 日。这很有用,因为如果要从一个给定的日期计算 1000 天之后,需要记住每个月有多少天,闰年的因素和其他棘手的细节。

datetime 模块为你处理所有这些问题。利用+和-运算符, timedelta 对象与 datetime 对象或其他 timedelta 对象相加或相
减。利用*和/运算符, timedelta 对象可以乘以或除以整数或浮点数。

15.4.2 暂停直至特定日期

time.sleep()方法可以暂停程序若干秒。利用一个 while 循环,可以让程序暂停,直到一个特定的日期。例如,下面的代码会继续循环,直到 2016 年万圣节:

time.sleep(1)调用将暂停你的 Python 程序,这样计算机不会浪费 CPU 处理周期,一遍又一遍地检查时间。相反, while 循环只是每秒检查一次,在 2016 年万圣节(或你编程让它停止的时间)后继续执行后面的程序。

 15.4.3 将 datetime 对象转换为字符串

Unix 纪元时间戳和 datetime 对象对人类来说都不是很友好可读。利用 strftime()方法,可以将 datetime 对象显示为字符串。(strftime()函数名中的 f 表示格式, format)。该的 strftime()方法使用的指令类似于 Python 的字符串格式化。表 15-1 列出了完
整的 strftime()指令。


向 strftime()传入一个定制的格式字符串,其中包含格式化指定(以及任何需要的斜线、冒号等), strftime()将返回一个格式化的字符串,表示 datetime 对象的信息。在交互式环境中输入以下代码:

15.4.4 将字符串转换成 datetime 对象

如果有一个字符串的日期信息,如'2015/10/21 16:29:00'或'October 21, 2015',需要将它转换为 datetime 对象,就用 datetime.datetime.strftime()函数。 strptime()函数与strftime()方法相反。定制的格式字符串使用相同的指令,像 strftime()一样。必须将格式字符串传入 strptime(),这样它就知道如何解析和理解日期字符串(strptime()函数名中 p 表示解析, parse)。
在交互式环境中输入以下代码:


要从字符串'October 21, 2015'取得一个 datetime 对象,将'October 21, 2015'作为第一个参数传递给 strptime(),并将对应于'October 21, 2015' 的定制格式字符串作为第二个参数。带有日期信息的字符串必须准确匹配定制的格式字符串,否则 Python
将抛出 ValueError 异常。

15.6 多线程

为了引入多线程的概念,让我们来看一个例子。假设你想安排一些代码,在一段延迟后或在特定时间运行。可以在程序启动时添加如下代码:



这段代码指定 2029 年 10 月 31 日作为开始时间,不断调用 time.sleep(1),直到开始时间。在等待 time.sleep()的循环调用完成时,程序不能做任何事情,它只是坐在那里,直到 2029 年万圣节。这是因为 Python 程序在默认情况下,只有一个执行线程。

不必让所有的代码等待,直到 time.sleep()函数完成,你可以使用 Python 的threading 模块,在单独的线程中执行延迟或安排的代码。这个单独的线程将因为time.sleep()调用而暂停。同时,程序可以在原来的线程中做其他工作。

要得到单独的线程,首先要调用 threading.Thread()函数,生成一个 Thread 对象。
在新的文件中输入以下代码,并保存为 threadDemo.py:

为了创建一个 Thread 对象,我们调用 threading.Thread(),并传入关键字参数 target=takeANap。这意味着我们
要在新线程中调用的函数是 takeANap()。请注意,关键字参数是 target=takeANap,而不是 target=takeANap()。这是因为你将 takeANap()函数本身作为参数,而不是调用 takeANap(),并传入它的返回值。
我们将 threading.Thread()创建的 Thread 对象保存在 threadObj 中,然后调用threadObj.start(),创建新的线程,并开始在新线程中执行目标函数。如果运行该程序,输出将像这样:


通常,程序在文件中最后一行代码执行后终止(或调用 sys.exit())。但threadDemo.py 有两个线程。第一个是最初的线程,从程序开始处开始,在 print('Endof program.')后结束。第二个线程是调用 threadObj.start()时创建的,始于 takeANap()
函数的开始处,在 takeANap()返回后结束。
在程序的所有线程终止之前, Python 程序不会终止。在运行 threadDemo.py 时,即使最初的线程已经终止,第二个线程仍然执行 time.sleep(5)调用。

















 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/1003840
推荐阅读
相关标签
  

闽ICP备14008679号