Python | time和datetime模块详解
对时间进行处理
python与时间处理相关的模块有两个: time模块和datetime模块(python的内置标准库,不需要去下载)
datetime模块, 常用类4个(date, time, datetime, timedelta)
概念:
- 在Python中,通常有这几种方式表示时间:时间戳、格式化的时间字符串、元组(struct_time 共九种元素)。由于Python的time模块主要是调用C库实现的,所以在不同的平台可能会有所不同。
- 时间戳(timestamp)的方式:时间戳表示是从1970年1月1号 00:00:00开始到现在按秒计算的偏移量。查看一下type(time.time())的返回值类型,可以看出是float类型。返回时间戳的函数主要有time()、clock()等。
- UTC(世界协调时),就是格林威治天文时间,也是世界标准时间。在中国为UTC+8。DST夏令时。
- 元组方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()
一、time模块
time模块中时间表现的格式主要有三种:
a、timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
b、struct_time时间元组,共有九个元素组。
c、format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。
time模块中常用的函数
使用该模块中的函数时,必须先引入该模块(import time)
1、time.time():返回当前时间的时间戳
实例:
import time
ls = time.time()
print(ls)
#输出结果
1646034067.319167
2、time.localtime( [secs] )
将一个时间戳转换为当前时区的struct_time,即时间数组格式的时间 ;
参数:
- sec – 转换为time.struct_time类型的对象的秒数
如果secs参数未提供,则以当前时间为准(即会默认调用time.time())。
实例:
import time
ls = time.localtime()
ls_1 = time.localtime(1646037618.0)
print(ls)
print(ls[0])
print(ls.tm_year)
#输出结果
time.struct_time(tm_year=2022, tm_mon=2, tm_mday=28, tm_hour=15, tm_min=28, tm_sec=56, tm_wday=0, tm_yday=59, tm_isdst=0)
time.struct_time(tm_year=2022, tm_mon=2, tm_mday=28, tm_hour=16, tm_min=40, tm_sec=18, tm_wday=0, tm_yday=59, tm_isdst=0)
2022
2022
3、time.gmtime([secs])
将一个时间戳转换为UTC时区的struct_time
time.gmtime() 函数将一个时间戳转换为UTC时区(0时区)的struct_time,可选的参数sec表示从1970-1-1 00:00:00以来的秒数。其默认值为time.time(),函数返回time.struct_time类型的对象。(struct_time是在time模块中定义的表示时间的对象)。
如果secs参数未提供,则以当前时间为准。
参数:
- sec – 转换为time.struct_time类型的对象的秒数
实例:
import time
ls = time.gmtime()
print(ls)
#输出结果
time.struct_time(tm_year=2022, tm_mon=2, tm_mday=28, tm_hour=8, tm_min=26, tm_sec=16, tm_wday=0, tm_yday=59, tm_isdst=0)
4、time.mktime(t):将一个struct_time转化为时间戳
time.mktime() 函数执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数表示时间的浮点数。
如果输入的值不是一个合法的时间,将触发 OverflowError 或 ValueError。
参数:
- t – 结构化的时间或者完整的9位元组元素
实例:
import time
ls = time.mktime(time.localtime())
ls_1 = time.mktime((2022,2,28,16,40,18,0,59,0))
print(ls,ls_1)
#输出结果
1646037990.0
1646037618.0
5、time.sleep(secs):线程推迟指定的时间运行
线程睡眠指定时间,单位为妙。
>>> time.sleep(10)
6、time.clock()
这个函数, 函数以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。
Python 3.8 已移除 clock() 方法, 可以使用 time.perf_counter() 或 time.process_time() 方法替代。
(1)time.perf_counter()
返回性能计数器的值(以小数秒为单位)作为浮点数,即具有最高可用分辨率的时钟,以测量短持续时间。 它确实包括睡眠期间经过的时间,并且是系统范围的。
通常perf_counter()用在测试代码时间上,具有最高的可用分辨率。不过因为返回值的参考点未定义,因此我们测试代码的时候需要调用两次,做差值。
perf_counter()会包含sleep()休眠时间,适用测量短持续时间
实例:
import time
start = time.perf_counter()
time.sleep(2)
end = time.perf_counter()
print(end-start)
#输出结果
-1.999896384
(2)time.process_time()
返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)作为浮点数。
通常time.process_time()也用在测试代码时间上,根据定义,它在整个过程中。返回值的参考点未定义,因此我们测试代码的时候需要调用两次,做差值。
注意process_time()不包括sleep()休眠时间期间经过的时间。
实例:
import time
start = time.process_time()
time.sleep(2)
end = time.process_time()
print(end-start)
#输出结果
0.0
此外Python3.7开始还提供了以上三个方法精确到纳秒的计时。分别是:
time.perf_counter_ns()
time.process_time_ns()
time.time_ns()
注意这三个精确到纳秒的方法返回的是整数类型。
7、time.asctime( [t] )
把一个表示时间的元组或者struct_time表示为 ‘Sun Aug 23 14:31:59 2015’ 这种形式。如果没有给参数,会将time.localtime()作为参数传入。
参数:
- t – 9个元素的元组或者通过函数 gmtime() 或 localtime() 返回的时间值
实例:
import time
ls = time.asctime()
ls_1 = time.asctime(time.gmtime())
print(ls,ls_1)
#输出结果
Mon Feb 28 18:00:21 2022
Mon Feb 28 10:00:21 2022
8、time.ctime([secs])
把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果为指定参数,将会默认使用time.time()作为参数。它的作用相当于time.asctime(time.localtime(secs))
参数:
- sec – 要转换为字符串时间的秒数
实例:
import time
ls = time.time()
ls_1 = time.ctime(ls)
ls_2 = time.ctime(1646042629.259167)
print(ls,ls_1,ls_2)
#输出结果
1646042649.472167
Mon Feb 28 18:04:09 2022
Mon Feb 28 18:03:49 2022
9、time.strftime( format [, t] )
返回字符串表示的当地时间。
把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串,格式由参数format决定。如果未指定,将传入time.localtime()。如果元组中任何一个元素越界,就会抛出ValueError的异常。函数返回的是一个可读表示的本地时间的字符串。
参数:
- format:格式化字符串
- t :可选的参数是一个struct_time对象
时间字符串支持的格式符号:(区分大小写)
- %a 本地星期名称的简写(如星期四为Thu)
- %A 本地星期名称的全称(如星期四为Thursday)
- %b 本地月份名称的简写(如八月份为agu)
- %B 本地月份名称的全称(如八月份为august)
- %c 本地相应的日期和时间的字符串表示(如:15/08/27 10:20:06)
- %d 一个月中的第几天(01 - 31)
- %f 微妙(范围0.999999)
- %H 一天中的第几个小时(24小时制,00 - 23)
- %I 第几个小时(12小时制,0 - 11)
- %j 一年中的第几天(001 - 366)
- %m 月份(01 - 12)
- %M 分钟数(00 - 59)
- %p 本地am或者pm的相应符
- %S 秒(00 - 61)
- %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
- %w 一个星期中的第几天(0 - 6,0是星期天)
- %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
- %x 本地相应日期字符串(如15/08/01)
- %X 本地相应时间字符串(如08:08:10)
- %y 去掉世纪的年份(00 - 99)两个数字表示的年份
- %Y 完整的年份(4个数字表示年份)
- %z 与UTC时间的间隔(如果是本地时间,返回空字符串)
- %Z 时区的名字(如果是本地时间,返回空字符串)
- %% ‘%’字符
实例:
import time
ls = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
print(ls)
#输出结果
2022-03-01 14:30:05
import time
a = (2022,3,1,14,30,30,0,0,0)
ls = time.strftime("%Y-%m-%d %H:%M:%S",a)
print(ls)
#输出结果
2022-03-01 14:30:30
获取当前时间
import time
ls = time.strftime("%Y-%m-%d %H:%M:%S")
print(ls)
#输出结果
2022-03-01 14:35:30
10、time.strptime(string[,format])
将格式字符串转化成struct_time.
该函数是time.strftime()函数的逆操作。time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组。所以函数返回的是struct_time对象。
参数:
- string :时间字符串
- format:格式化字符串
创建一个时间字符串变量stime,
通过strptime()函数将stime转化成strcut_time形式
实例:
import time
stime = "2015-08-24 13:01:30"
ls = time.strptime(stime,"%Y-%m-%d %H:%M:%S")
print(ls) #输出结果
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=1, tm_sec=30, tm_wday=0, tm_yday=236, tm_isdst=-1)
注意:在使用strptime()函数将一个指定格式的时间字符串转化成元组时,参数format的格式必须和string的格式保持一致,如果string中日期间使用“-”分隔,format中也必须使用“-”分隔,时间中使用冒号“:”分隔,后面也必须使用冒号分隔,否则会报格式不匹配的错误。
二、datetime模块
datatime模块重新封装了time模块,提供更多接口,
提供的类有:date,time,datetime,timedelta,tzinfo
datetime模块定义了5个类,分别是
1.datetime.date:表示日期的类
2.datetime.datetime:表示日期时间的类
3.datetime.time:表示时间的类
4.datetime.timedelta:表示时间间隔,即两个时间点的间隔
5.datetime.tzinfo:时区的相关信息
from datetime import date
from datetime import datetime
from datetime import time
from datetime import timedelta
from datetime import tzinfo
1、datetime.date类:
date类有三个参数,datetime.date(year,month,day),返回year-month-day。
静态方法和字段:
date.max、date.min:date对象所能表示的最大、最小日期;
date.resolution:date对象表示日期的最小单位。这里是天。
date.today():返回一个表示当前本地日期的date对象;
date.fromtimestamp(timestamp):根据给定的时间戮,返回一个date对象;
from datetime import *
import time
print('date.max:', date.max)
print('date.min:', date.min)
print('date.today():', date.today())
print('date.fromtimestamp():', date.fromtimestamp(time.time()))
#Output==============
# date.max: 9999-03-01
# date.min: 0001-03-01
# date.today(): 2022-03-01
# date.fromtimestamp(): 2020-03-01
在date前加datetime效果一样~
方法和属性:
d1 = date(2011,06,03) #date对象
d1.year、date.month、date.day:年、月、日;
d1.replace(year, month, day):生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变)
d1.timetuple():返回日期对应的time,struct_time对象;
d1.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推;
d1.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
d1.isocalendar():返回格式如(year,month,day)的元组;
d1.isoformat():返回格式如'YYYY-MM-DD’的字符串;
d1.strftime(fmt):和time模块format相同。
d1.ctime():返回格式如 Sun Apr 16 00:00:00 2021
from datetime import *
now = date(2016, 10, 26)
tomorrow = now.replace(day = 27)
print('now:', now, ', tomorrow:', tomorrow)
print('timetuple():', now.timetuple())
print('weekday():', now.weekday())
print('isoweekday():', now.isoweekday())
print('isocalendar():', now.isocalendar())
print('isoformat():', now.isoformat())
print('strftime():', now.strftime("%Y-%m-%d"))
print('ctime():'d1.ctime())
#Output========================
# now: 2016-10-26 , tomorrow: 2016-10-27
# timetuple(): time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=300, tm_isdst=-1)
# weekday(): 2
# isoweekday(): 3
# isocalendar(): (2016, 43, 3)
# isoformat(): 2016-10-26
# strftime(): 2016-10-26
# ctime():Wed Oct 26 00:00:00 2016
二、看一下datetime的time类
time类有5个参数,datetime.time(hour,minute,second,microsecond,tzoninfo),返回08:29:30
datetime.time
import datetime
ls = datetime.time(22,12,13,10)
print(ls)
#输出结果
22:12:13.000010
静态方法和字段:
time.min、time.max:time类所能表示的最小、最大时间。其中,time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999);
time.resolution:时间的最小单位,这里是1微秒;
print(datetime.time.min)
00:00:00
t1 = datetime.time(10,23,15) #time对象
t1.hour、t1.minute、t1.second、t1.microsecond:时、分、秒、微秒;
t1.tzinfo:时区信息;
t1.replace([ hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ):创建一个新的时间对象,用参数指定的时、分、秒、微秒代替原有对象中的属性(原有对象仍保持不变);
t1.isoformat():返回型如"HH:MM:SS"格式的字符串表示;
t1.strftime(fmt):同time模块中的format;
t1.tzname():返回时区名字;
t1.utcoffset():返回时区的时间偏移量
from datetime import *
tm = time(23, 46, 10)
print('tm:', tm)
print('hour: %d, minute: %d, second: %d, microsecond: %d' % (tm.hour, tm.minute, tm.second, tm.microsecond))
tm1 = tm.replace(hour=20)
print('tm1:', tm1)
print('isoformat():', tm.isoformat())
print('strftime()', tm.strftime("%X"))
#Output==============================================
# tm: 23:46:10
# hour: 23, minute: 46, second: 10, microsecond: 0
# tm1: 20:46:10
# isoformat(): 23:46:10
# strftime() 23:46:10
三、datetime的datetime类
datetime类有很多参数,datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]),返回年月日,时分秒
静态方法和字段:
- datetime.today():返回一个表示当前本地时间的datetime对象;
- datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
- datetime.utcnow():返回一个当前utc时间的datetime对象;#格林威治时间
- datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
- datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
- datetime.combine(date, time):根据date和time,创建一个datetime对象;
- datetime.strptime(date_string, format):将格式字符串转换为datetime对象;
from datetime import *
import time
print('datetime.max:', datetime.max)
print('datetime.min:', datetime.min)
print('datetime.resolution:', datetime.resolution)
print('today():', datetime.today())
print('now():', datetime.now())
print('utcnow():', datetime.utcnow())
print('fromtimestamp(tmstmp):', datetime.fromtimestamp(time.time()))
print('utcfromtimestamp(tmstmp):', datetime.utcfromtimestamp(time.time()))
#output======================
# datetime.max: 9999-12-31 23:59:59.999999
# datetime.min: 0001-01-01 00:00:00
# datetime.resolution: 0:00:00.000001
# today(): 2016-10-26 23:12:51.307000
# now(): 2016-10-26 23:12:51.307000
# utcnow(): 2016-10-26 15:12:51.307000
# fromtimestamp(tmstmp): 2016-10-26 23:12:51.307000
# utcfromtimestamp(tmstmp): 2016-10-26 15:12:51.307000
方法和属性:
dt=datetime.now()#datetime对象
dt.year、month、day、hour、minute、second、microsecond、tzinfo:
dt.date():获取date对象;
dt.time():获取time对象;
dt. replace ([ year[ , month[ , day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ] ] ]):
dt. timetuple ()
dt. utctimetuple ()
dt. toordinal ()
dt. weekday ()
dt. isocalendar ()
dt. isoformat ([ sep] )
dt. ctime ():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
dt. strftime (format)
【【【
datetime.datetime.ctime() 将datetime.datetime类型转化成str类型
print(datetime.datetime.now().ctime())
Tue Mar 1 23:00:31 2022
datetime.datetime.now():返回当前系统时间
print(datetime.datetime.now())
2022-03-01 22:49:51.087872
datetime.datetime.now().date():返回当前日期时间的日期部分
print(datetime.datetime.now().date())
2022-03-01
datetime.datetime.now().time():返回当前日期时间的时间部分
print(datetime.datetime.now().time())
22:55:36.096962
datetime.datetime.strftime():由日期格式转化为字符串格式
datetime.datetime.now().strftime('%b-%d-%Y %H:%M:%S')
'Apr-16-2017 21:01:35'
datetime.datetime.strptime():由字符串格式转化为日期格式
datetime.datetime.strptime('Apr-16-2017 21:01:35', '%b-%d-%Y %H:%M:%S')
2017-04-16 21:01:35
】】】
四、datetime的timedelta类
datetime.timedelta用来计算两个datetime.datetime或者datetime.date类型之间的时间差。
def __new__(cls, days=0, seconds=0, microseconds=0,milliseconds=0, minutes=0, hours=0, weeks=0):
从构造函数中来看,参数可选:days、seconds、microseconds、milliseconds、minutes、hours、weeks,且默认是0。
实例:
1. 查询300天前是几月几号
import datetime
now = datetime.datetime.now().date()
delta = datetime.timedelta(days = 300)
print(now - delta)
#输出结果
2021-05-07
2. datetime.timedelta()也可以多个参数,比如计算300天12小时前的时间
import datetime
now = datetime.datetime.now()
delta = datetime.timedelta(days = 300,hours = 12)
print(now - delta)
#输出结果
2021-05-06 23:51:36.405974
3. 计算总天数和秒数
>>> datetime.timedelta(days=1,hours = 2).days 1 >>> datetime.timedelta(days=1,hours = 2).total_seconds() 93600.0
5、tzinfo时区类
#! /usr/bin/python
# coding=utf-8
from datetime import datetime, tzinfo,timedelta
"""
tzinfo是关于时区信息的类
tzinfo是一个抽象类,所以不能直接被实例化
"""
class UTC(tzinfo):
"""UTC"""
def __init__(self,offset = 0):
self._offset = offset
def utcoffset(self, dt):
return timedelta(hours=self._offset)
def tzname(self, dt):
return "UTC +%s" % self._offset
def dst(self, dt):
return timedelta(hours=self._offset)
#北京时间
beijing = datetime(2011,11,11,0,0,0,tzinfo = UTC(8))
print "beijing time:",beijing
#曼谷时间
bangkok = datetime(2011,11,11,0,0,0,tzinfo = UTC(7))
print "bangkok time",bangkok
#北京时间转成曼谷时间
print "beijing-time to bangkok-time:",beijing.astimezone(UTC(7))
#计算时间差时也会考虑时区的问题
timespan = beijing - bangkok
print "时差:",timespan
#Output==================
# beijing time: 2011-11-11 00:00:00+08:00
# bangkok time 2011-11-11 00:00:00+07:00
# beijing-time to bangkok-time: 2011-11-10 23:00:00+07:00
# 时差: -1 day, 23:00:00