4.4 时间处理
Python提供了3个时间处理库,分别是time、datetime和calendar。这3个库均被收录到Python标准库中,如表4-6所示。
表4-6 时间处理库
3个时间处理库从功能上看,可以认为是互补关系,三者侧重点不同。下面我们将简要展开讲解使用最多的time库和datetime库。
时间相关概念
格林尼治时间(Greenwich mean time,GMT)指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义为通过那里的经线,GMT又称世界时UT。
协调世界时(coordinated universal time,UTC),又称世界标准时间,基于国际原子钟,误差为每日数纳秒。
时区指地球上的区域使用同一个时间定义。有关国际会议决定将地球表面按经线划分成24个时区,并且规定相邻区域的时间相差1小时。人们每跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。例如我国处于东八区,表示为GMT+8。
UNIX时间戳是从UTC(1970年1月1日0时0分0秒)开始到现在的时间(以秒为单位)的数值。
1.time库
最常用的是获取时间戳,例如使用time.time(),可以得到输出1659340903.744475。时间戳指从epoch(1970年1月1日00:00:00 UTC)到现在的时间(以秒为单位)的数值,返回值为浮点型,用的是UTC。一般在使用时会进行时间戳、格式化或结构化的转换。
另外,对于格式化时间字符串,time提供了strftime()和strptime()来实现时间和字符串之间的转换:
strftime,即string format time,用来将时间格式化成字符串;
strptime,即string parse time,用来将字符串解析成时间。
示例如下:
import time
gmtime = time.gmtime()
time.strftime('%Y-%m-%d %H:%M:%S', gmtime) # struct_time转换成字符串?
输出结果如下:
2023-02-17 09:49:21
2.datetime库
time库解决了时间的获取和格式化表示,datetime库则进一步解决了快速获取并操作时间中年、月、日、时、分、秒的能力,提供的类主要有datetime、time、date、timedelta等。
(1)datetime类的方法如表4-7所示。
表4-7 datetime类的方法
示例如下:
import datetime
import time
datetime.datetime.fromtimestamp(time.time()) # 将time.time()转换成datetime对象?
输出结果如下:
2023-02-17 17:48:33.169588
(2)time类,表示时间值,可以创建的对象只有时、分、秒、毫秒等,time类的方法如表4-8所示。
表4-8 time类的方法
示例如下:
import datetime
t = datetime.time(15,12,25)
t.second
输出结果如下:
25
(3)date类,表示日期值,可以创建的对象只有年月日,date类的方法如表4-9所示。
表4-9 date类的方法
示例如下。
import datetime
today = datetime.date.today()
today.year?
输出结果如下:
2023
(4)timedelta类,在实际使用时,常用的功能除了各种时间的转换,还有对日期时间的比较和加减运算,timedelta类的方法如表4-10所示。
表4-10 timedelta类的方法
示例如下。
import datetime
today = datetime.date.today() # 获取当前日期的datetime对象
onday = datetime.timedelta(days=1) # 获取一个单位为一天的timedelta对象
today - onday # 取前一天?
输出结果如下:
2023-02-16
3.时间操作的示例
代码清单4-5封装了时间操作的工具,包含日、时、分、秒和增加指定时间的转换等。
# -*- coding: utf-8 -*-
# @Time : 2022/2/18 11:20 上午
# @Project : timeDemo
# @File : datetimeUtil.py
# @Author : hutong
# @Describe: 微信公众号:大话性能
# @Version: Python3.9.8
?
import datetime
from datetime import datetime as date
from dateutil.relativedelta import relativedelta
?
class DateTimeTools():
def addDay(self,dateparam,number):
"""
函数描述:
将指定日期加/减指定天数,月、年自动递增/减
用法:addDay(日期,天数)
示例:假设日期值为2021-06-25,addDay(日期,5) => 2021-06-30
"""
newDate = date.strptime(str(dateparam), "%Y-%m-%d").date() + datetime.timedelta
(days=number)
return newDate
def addHour(self,dateparam,number):
"""
函数描述:
将指定日期加/减指定小时数,天自动递增/减
用法:addHour(日期,小时数)
示例:假设日期值为2021-06-25 15:12:42,addHour(日期,5) => 2021-06-25 20:12:42
"""
try:
newDate = date.strptime(str(dateparam), "%Y-%m-%d %H:%M:%S") + datetime.
timedelta(hours=number)
return newDate
except ValueError:
raise ValueError("日期格式需为:%Y-%m-%d %H:%M:%S")
def addMinutes(self,dateparam,number):
"""
函数描述:
将指定日期加/减指定分钟数,小时自动递增/减
用法:addMinutes(日期,分钟数)
示例:假设日期值为2021-06-25 15:12:42,addMinutes(日期,2) => 2021-06-25 15:14:42
"""
try:
newDate = date.strptime(str(dateparam), "%Y-%m-%d %H:%M:%S") + datetime.
timedelta(minutes=number)
return newDate
except ValueError:
raise ValueError("日期格式需为:%Y-%m-%d %H:%M:%S")
def addSeconds(self,dateparam,number):
"""
函数描述:
将指定日期加/减指定秒数,分钟自动递增/减
用法:addSeconds(日期,秒数)
示例:假设日期值为2021-06-25 15:12:42,addSeconds(日期,10) => 2021-06-25 15:12:52
"""
try:
newDate = date.strptime(str(dateparam), "%Y-%m-%d %H:%M:%S") + datetime.
timedelta(seconds=number)
return newDate
except ValueError:
raise ValueError("日期格式需为:%Y-%m-%d %H:%M:%S")
?
def numberToDate(self,year,month,day):
"""
函数描述:将数字转换为日期(年、月、日需为数字)
用法:numberToDate(年,月,日)
示例:numberToDate(2021,06,25)=> 2021-06-25 或者 numberToDate('2021','06',
'25') => 2021-06-25
"""
param = (str(year),str(month),str(day))
newDate = date.strptime("-".join(param), "%Y-%m-%d").date()
return newDate
def get_day(self,dateparam):
"""
函数描述:获取日期的日
用法:get_day(日期)
示例:假设日期时间为2021-06-25,get_day(日期) => 25
"""
newDate = str( date.strptime(str(dateparam), "%Y-%m-%d"))[8:10]
return newDate
def get_hour(self,dateparam):
"""
函数描述:获取日期的时
用法:get_hour(日期)
示例:假设日期时间为2021-06-25 15:12:42,get_hour(日期) => 15
"""
try:
newDate = str( date.strptime(str(dateparam), "%Y-%m-%d %H:%M:%S")).
split(":")[0][-2:]
return newDate
except ValueError:
raise ValueError("日期格式需为:%Y-%m-%d %H:%M:%S")
def get_minute(self,dateparam):
"""
函数描述:获取日期的分
用法:get_minute(日期)
示例:假设日期时间为2021-06-25 15:12:42,get_minute(日期) => 12
"""
try:
newDate = str( date.strptime(str(dateparam), "%Y-%m-%d %H:%M:%S")).split(":")[1]
return newDate
except ValueError:
raise ValueError("日期格式需为:%Y-%m-%d %H:%M:%S")
def get_second(self,dateparam):
"""
函数描述:获取日期的秒
用法:get_second(日期)
示例:假设日期时间为2021-06-25 15:12:42,get_second(日期) => 42
"""
try:
newDate = str( date.strptime(str(dateparam), "%Y-%m-%d %H:%M:%S")).split(":")[2]
return newDate
except ValueError:
raise ValueError("日期格式需为:%Y-%m-%d %H:%M:%S")?
代码清单4-5 datetimeUtil
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责