python datetime 模块

time 模块用于取得 Unix 纪元时间戳,并加以处理。但是,如果以更方便的格式显示日期,或对日期进行算术运算(例如,搞清楚 205 天前是什么日期,或 123天后是什么日期),就应该使用 datetime 模块。datetime 模块有自己的 datetime 数据类型。 datetime 值表示一个特定的时刻。 在交互式环境中输入以下代码:

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2015, 2, 27, 11, 10, 49, 55, 53)
>>> dt = datetime.datetime(2015, 10, 21, 16, 29, 0)
>>> dt.year, dt.month, dt.day
(2015, 10, 21)
>>> dt.hour, dt.minute, dt.second
(16, 29, 0)

调用 datetime.datetime.now()返回一个 datetime 对象,表示当前的日期和时间,根据你的计算机的时钟。这个对象包含当前时刻的年、月、日、时、分、秒和微秒。也可以利用 datetime.datetime()函数,向它传入代表年、月、日、时、分、秒的整数,得到特定时刻的 datetime 对象。这些整数将保存在 datetime 对象的 year、month、 day、 hour、 minute 和 second属性中。Unix 纪元时间戳可以通过 datetime.datetime.fromtimestamp(),转换为 datetime对象。 datetime 对象的日期和时间将根据本地时区转换。在交互式环境中输入以下代码:

>>> datetime.datetime.fromtimestamp(1000000)
datetime.datetime(1970, 1, 12, 5, 46, 40)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2015, 2, 27, 11, 13, 0, 604980)

调用 datetime.datetime.fromtimestamp()并传入 1000000,返回一个 datetime 对象, 表示 Unix 纪元后 1000000 秒的时刻。传入 time.time(),即当前时刻的 Unix 纪元时间戳,则返回当前时刻的 datetime 对象。因此,表达式 datetime.datetime.now()和 datetime.datetime.fromtimestamp(time.time())做的事情相同,它们都返回当前时刻的 datetime 对象。datetime 对象可以用比较操作符进行比较,弄清楚谁在前面。后面的 datetime 对象是“更大”的值。在交互式环境中输入以下代码:

>>> halloween2015 = datetime.datetime(2015, 10, 31, 0, 0, 0)
>>> newyears2016 = datetime.datetime(2016, 1, 1, 0, 0, 0)
>>> oct31_2015 = datetime.datetime(2015, 10, 31, 0, 0, 0)
>>> halloween2015 == oct31_2015
True
>>> halloween2015 > newyears2016
False
>>> newyears2016 > halloween2015
True
>>> newyears2016 != oct31_2015
True

为 2015 年 10 月 31 日的第一个时刻(午夜)创建一个 datetime 对象,将它保存在 halloween2015 中。为 2016 年 1 月 1 日的第一个时刻创建一个 datetime 对象,将它保存在 newyears2016 中。然后,为 2015 年 10 月 31 日的午夜创建另一个对象,
将它保存在 oct31_2015 中。比较 halloween2015 和 oct31_2015,它们是相等的。比较 newyears2016 和 halloween2015, newyears2016 大于(晚于) halloween2015 。
 

timedelta 数据类型
datetime 模块还提供了 timedelta 数据类型,它表示一段时间,而不是一个时刻。在交互式环境中输入以下代码:

>>> 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'

创建 timedelta 对象,就用 datetime.timedelta()函数。 datetime.timedelta()函数接受关键字参数 weeks、 days、 hours、 minutes、 seconds、 milliseconds 和 microseconds。没有 month 和 year 关键字参数,因为“月”和“年”是可变的时间,依赖于特定月份或年份。 timedelta 对象拥有的总时间以天、秒、微秒来表示。这些数字分别保存在 days、 seconds 和 microseconds 属性中。 total_seconds()方法返回只以秒表示的时间。将一个 timedelta 对象传入 str(),将返回格式良好的、人类可读的字符串表示。在这个例子中,我们将关键字参数传入 datetime.delta(),指定 11 天、 10 小时、9 分和 8 秒的时间,将返回的 timedelta 对象保存在 delta 中。该 timedelta 对象的days 属性为 11, seconds 属性为 36548(10 小时、 9 分钟、 8 秒,以秒表示)。调用 total_seconds()告诉我们, 11 天、 10 小时、 9 分和 8 秒是 986948 秒。最后,将这个timedelta 对象传入 str(),返回一个字符串,明确解释了这段时间。算术运算符可以用于对 datetime 值进行日期运算。例如,要计算今天之后 1000天的日期,在交互式环境中输入以下代码:

>>> dt = datetime.datetime.now()
>>> dt
datetime.datetime(2015, 2, 27, 18, 38, 50, 636181)
>>> thousandDays = datetime.timedelta(days=1000)
>>> dt + thousandDays
datetime.datetime(2017, 11, 23, 18, 38, 50, 636181)

首先,生成表示当前时刻的 datetime 对象,保存在 dt 中。然后生成一个 timedelta对象,表示 1000 天,保存在 thousandDays 中。 dt 与 thousandDays 相加,得到一个datetime 对象,表示现在之后的 1000 天。 Python 将完成日期运算,弄清楚 2015 年2 月 27 日之后的 1000 天,将是 2017 年 11 月 23 日。这很有用,因为如果要从一个给定的日期计算 1000 天之后,需要记住每个月有多少天,闰年的因素和其他棘手的细节。 datetime 模块为你处理所有这些问题。利用+和-运算符, timedelta 对象与 datetime 对象或其他 timedelta 对象相加或相减。利用*和/运算符, timedelta 对象可以乘以或除以整数或浮点数。在交互式环境
中输入以下代码:

>>> oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0)
>>> aboutThirtyYears = datetime.timedelta(days=365 * 30)
>>> oct21st
datetime.datetime(2015, 10, 21, 16, 29)
>>> oct21st - aboutThirtyYears
datetime.datetime(1985, 10, 28, 16, 29)
>>> oct21st - (2 * aboutThirtyYears)
datetime.datetime(1955, 11, 5, 16, 29)

这里,我们生成了一个 DateTime 对象,表示 2015 年 10 月 21 日,以及一个timedelta 对象,表示大约 30 年的时间(我们假设每年为 365 天) 。从 oct21st 中减去 aboutThirtyYears,我们就得到一个 datetime 对象,表示 2015 年 10 月 21 日前 30年的一天。从 oct21st 中减去 2 * aboutThirtyYears,得到一个 datetime 对象,表示 2015年 10 月 21 日之前 60 年的一天。
 

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

import datetime
import time
halloween2016 = datetime.datetime(2016, 10, 31, 0, 0, 0)
while datetime.datetime.now() < halloween2016:
    time.sleep(1)

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

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

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

>>> 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("%B of '%y")
"October of '15

这里,我们有一个 datetime 对象,表示 2015 年 10 月 21 日下午 4 点 29 分,保存在 oct21st 中。向 strftime()传入定制的格式字符串'%Y/%m/%d %H:%M:%S,返回一个字符串,包含以斜杠分隔的 2015、 10 和 21,以冒号分隔的 16、 29 和 00。传入'%I:%M% p'则返回'04:29 PM',传入"%B of '%y"则返回"October of '15"。请注意,strftime()不是以 datetime.datetime 开始。
 

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

>>> 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)
>>> datetime.datetime.strptime("October of '15", "%B of '%y")
datetime.datetime(2015, 10, 1, 0, 0)
>>> datetime.datetime.strptime("November of '63", "%B of '%y")
datetime.datetime(2063, 11, 1, 0, 0)

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

猜你喜欢

转载自blog.csdn.net/dongyu1703/article/details/82831339