python时间函数详解_详解 Python 中与时间有关的函数

--------------------

**坐在电脑前运行程序是不错的,但在你没有直接监督时运行程序,也是有用的。计算机的时钟可以调度程序,在特定的

时间和日期运行,或定期运行。例如,程序可以每小时抓取一个网站,检查变更,或在凌晨 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 纪元时间戳。

![20181226215347265.png][]

## 15.1.2 time.sleep()函数 ##

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

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

# 15.2 datetime 模块 #

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

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

![20181226215846296.png][]

调用 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天的日期,在交互式环境中输入以下代码:![20181226220552795.png][]

首先,生成表示当前时刻的 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 年万圣节:![20181226220817599.png][]

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

##  15.4.3 将 datetime 对象转换为字符串 ##

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

整的 strftime()指令。

![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Zlcm1vbnRf_size_16_color_FFFFFF_t_70][]

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

![20181226221116573.png][]

## 15.4.4 将字符串转换成 datetime 对象 ##

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

在交互式环境中输入以下代码:

![20181226221241712.png][]

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

将抛出 ValueError 异常。

# 15.6 多线程 #

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

![20181226221708899.png][]

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

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

要得到单独的线程,首先要调用 threading.Thread()函数,生成一个 Thread 对象。

在新的文件中输入以下代码,并保存为 threadDemo.py:

![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Zlcm1vbnRf_size_16_color_FFFFFF_t_70 1][]

为了创建一个 Thread 对象,我们调用 threading.Thread(),并传入关键字参数 target=takeANap。这意味着我们

要在新线程中调用的函数是 takeANap()。请注意,关键字参数是 target=takeANap,而不是 target=takeANap()。这是因为你将 takeANap()函数本身作为参数,而不是调用 takeANap(),并传入它的返回值。

我们将 threading.Thread()创建的 Thread 对象保存在 threadObj 中,然后调用threadObj.start(),创建新的线程,并开始在新线程中执行目标函数。如果运行该程序,输出将像这样:

![20181226222220292.png][]

通常,程序在文件中最后一行代码执行后终止(或调用 sys.exit())。但threadDemo.py 有两个线程。第一个是最初的线程,从程序开始处开始,在 print('Endof program.')后结束。第二个线程是调用 threadObj.start()时创建的,始于 takeANap()

函数的开始处,在 takeANap()返回后结束。

在程序的所有线程终止之前, Python 程序不会终止。在运行 threadDemo.py 时,即使最初的线程已经终止,第二个线程仍然执行 time.sleep(5)调用。

[20181226215347265.png]: /images/1599323474383.png

[20181226215846296.png]: /images/1599323456975.png

[20181226220552795.png]: /images/1599323441813.png

[20181226220817599.png]: /images/1599323420361.png

[watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Zlcm1vbnRf_size_16_color_FFFFFF_t_70]: /images/1599323403398.png

[20181226221116573.png]: /images/1599323387637.png

[20181226221241712.png]: /images/1599323373188.png

[20181226221708899.png]: /images/1599323358876.png

[watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Zlcm1vbnRf_size_16_color_FFFFFF_t_70 1]: /images/1599323346516.png

[20181226222220292.png]: /images/1599323330691.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值