- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
15.4 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 ❹❺。
15.4.1 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年的一天。
15.4.2 暂停直至特定日期
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年万圣节(或你编程让它停止的时间)后继续执行后面的程序。
15.4.3 将datetime对象转换为字符串
Unix纪元时间戳和datetime对象对人类来说都不是很友好可读。利用strftime()方法,可以将datetime对象显示为字符串。(strftime()函数名中的f表示格式,format)。
该的strftime()方法使用的指令类似于Python的字符串格式化。表15-1列出了完整的strftime()指令。
表15-1 strftime()指令
strftime指令
含义
%Y
带世纪的年份,例如'2014'
%y
不带世纪的年份,'00'至'99'(1970至2069)
%m
数字表示的月份, '01'至'12'
%B
完整的月份,例如'November'
%b
简写的月份,例如'Nov'
%d
一月中的第几天,'01'至'31'
%j
一年中的第几天,'001'至'366'
%w
一周中的第几天,'0'(周日)至'6'(周六)
%A
完整的周几,例如'Monday'
%a
简写的周几,例如'Mon'
%H
小时(24小时时钟),'00'至'23'
%I
小时(12小时时钟),'01'至'12'
%M
分,'00'至'59'
%S
秒,'00'至'59'
%p
'AM'或'PM'
%%
就是'%'字符
向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开始。
15.4.4 将字符串转换成datetime对象
如果有一个字符串的日期信息,如'2015/10/21 16:29:00'或'October 21, 2015',需要将它转换为datetime对象,就用datetime.datetime.strftime()函数。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异常。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论