Python学习之路(27)——时间相关模块time&datetime
一、time模块
三种格式:
1、timestamp时间戳:基于Unix时间戳,时间表示的范围为1970-2038年之间,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量;
2、struct_time时间元组,有9个元素组:tm_year(年,4位数)、tm_mon(月)、tm_mday(日)、tm_hour(小时)、tm_min(分钟)、tm_sec(秒)、tm_wday(一周的第几日,0-6,0表示周一)、tm_yday(一年的第几日)、tm_isdst(夏令时,默认为-1)
3、format time时间字符串
time.localtime()返回struct_time
>>> time.localtime() time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=13, tm_min=53, tm_sec=44, tm_wday=6, tm_yday=70, tm_isdst=0)
time.time()返回当前时间的时间戳
>>> time.time() 1520747165.2202055
time.mktime()将struct_time转换为时间戳
>>> time.time() 1520748112.558515 >>> time.mktime(time.localtime()) 1520748125.0
time.gmtime(secs),与time.localtime相似,返回struct_time,该时间为转换为UTC时区的时间
>>> time.gmtime() time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=6, tm_min=4, tm_sec=50, tm_wday=6, tm_yday=70, tm_isdst=0) >>> time.gmtime(time.time()) time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=6, tm_min=4, tm_sec=59, tm_wday=6, tm_yday=70, tm_isdst=0) >>> time.localtime() time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=14, tm_min=5, tm_sec=5, tm_wday=6, tm_yday=70, tm_isdst=0)
time.sleep(secs)线程延迟指定的时间运行,单位为秒
>>> time.sleep(5)
time.clock(),在UNIX系统上,返回进程时间(用秒表示的浮点数,时间戳);在Windows系统中,第一次调用返回的是进程运行的实际时间,第二次之后的调用是自第一次调用以后到现在的运行时间。
import time time.sleep(3) print(time.clock()) time.sleep(5) print(time.clock()) time.sleep(8) print(time.clock()) #执行结果为 7.292592294136501e-07 4.999570466313875 12.99863956690753
time.asctime([t]),将一个表示时间的元组以struct_time格式表示;没有时间元组参数,则将time.localtime()作为参数传入
>>> time.asctime() 'Sun Mar 11 14:21:05 2018' >>> time.asctime((2018, 3, 11, 20, 20, 20, 6 ,1 , 1)) 'Sun Mar 11 20:20:20 2018'
time.ctime(secs),将一个时间戳转换为time.asctime()的形式;没有参数或参数为None,则将time.time()作为参数传入。相当于time.asctime(time.localtime())
>>> time.ctime() 'Sun Mar 11 14:24:20 2018' >>> time.ctime(5555555555.555) 'Tue Jan 18 17:52:35 2146'
time.strftimr(format[, t]),将指定的struct_time(默认是当前时间),根据指定的格式化字符串输出,其中:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(0000-9999)
%m 月份(01-12)
%d 月内的一天(0-31)
%H 24小时制小时数(0-23)
%l 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
>>> time.strftime('%Y%m%d%H%M%S',time.gmtime())
'20180311062958'
>>> time.strftime('%Y%m%d%H%M%S')
'20180311143005'
>>> time.strftime('%Y-%m-%d %H:%M:%S')
'2018-03-11 14:30:14'
time.strptime(string[, format]),与time.strftime相反,将时间字符串转换为struct_time格式表示
>>> time.strptime("2018-03-11", "%Y-%m-%d")
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=70, tm_isdst=-1)
>>> time.strptime("2018-03-11 14:34:50", "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=14, tm_min=34, tm_sec=50, tm_wday=6, tm_yday=70, tm_isdst=-1)
二、datetime模块
datetime模块提供对时间和日期的封装,并提供它们之间的数学运算。该模块包含5个类:
datetime.date:年月日构成的日期(相当于日历)
datetime.time:时分秒和微秒构成的一天24小时内的具体时间(相当于手表)
datetime.datetime:date和time结合在一起,年月日加上具体时间
datetime.timedelta:时间间隔对象(datedelta)。一个时间点(datetime)加上一个时间间隔(timedelta)可以得到一个新的时间点(datetime)。
1、date类
>>> import datetime >>> import time #####类方法和类属性 >>> print(datetime.date.today()) 2018-03-11 >>> print(datetime.date(2018, 3, 11)) 2018-03-11 >>> print(datetime.date.max) 9999-12-31 >>> print(datetime.date.max) 9999-12-31 >>> print(datetime.date.min) 0001-01-01 >>> print(datetime.date.fromtimestamp(time.time())) 2018-03-11
>>> print(datetime.date.resolution
1 day, 0:00:00 #####实例方法和实例属性 >>> d = datetime.date(2018, 3, 11) >>> print(d.year) 2018 >>> print(d.month) 3 >>> print(d.day) 11 >>> print(d.replace(day = 12)) 2018-03-12 >>> print(d.timetuple()) time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=70, tm_isdst=-1) >>> print(d.weekday()) 6 >>> print(d.isoweekday()) 7 >>> print(d.isocalendar()) (2018, 10, 7) >>> print(d.isoformat()) 2018-03-11 >>> print(d.strftime("%Y-%m-%d")) 2018-03-11
2、time类
#####类方法和类属性
>>> datetime.time.max
datetime.time(23, 59, 59, 999999)
>>> print(datetime.time.max)
23:59:59.999999
>>> print(datetime.time.min)
00:00:00
>>> print(datetime.time.resolution)
0:00:00.000001
#####实例方法和实例属性
>>> tm = datetime.time(15, 15, 15)
>>> print(tm)
15:15:15
>>> print(tm.hour, tm.minute, tm.second, tm.microsecond)
15 15 15 0
>>> print(tm.replace(hour = 16))
16:15:15
>>> print(tm.isoformat())
15:15:15
>>> print(tm.strftime('%X'))
15:15:15
3、datetime类
#####类方法和类属性
>>> print(datetime.datetime.max)
9999-12-31 23:59:59.999999
>>> print(datetime.datetime.min)
0001-01-01 00:00:00
>>> print(datetime.datetime.resolution)
0:00:00.000001
>>> print(datetime.datetime.today())
2018-03-11 15:24:46.543515
>>> print(datetime.datetime.now())
2018-03-11 15:24:52.677515
>>> print(datetime.datetime.fromtimestamp(time.time()))
2018-03-11 15:25:38.527515
>>> print(datetime.datetime.utcfromtimestamp(time.time()))
2018-03-11 07:26:07.523515
#####实例方法和实例属性
>>> dt = datetime.datetime.now()
>>> print(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
2018 3 11 15 27 4 348515 None
>>> print(dt.date())
2018-03-11
>>> print(dt.time())
15:27:04.348515
>>> print(dt.replace(day = 12))
2018-03-12 15:27:04.348515
>>> print(dt.timetuple())
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=15, tm_min=27, tm_sec=4, tm_wday=6, tm_yday=70, tm_isdst=-1)
>>> print(dt.utctimetuple())
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=11, tm_hour=15, tm_min=27, tm_sec=4, tm_wday=6, tm_yday=70, tm_isdst=0)
>>> print(dt.toordinal())
736764
>>> print(dt.weekday())
6
>>> print(dt.isocalendar())
(2018, 10, 7)
>>> print(dt.isoformat())
2018-03-11T15:27:04.348515
>>> print(dt.ctime())
Sun Mar 11 15:27:04 2018
>>> print(dt.strftime("%Y-%m-%d %H:%M:%S"))
2018-03-11 15:27:04
4、timedelta类
>>> dt =datetime.datetime.now() >>> dt1 = dt + datetime.timedelta(days = -1) >>> print(dt1) 2018-03-10 15:34:26.853515 >>> dt2 = dt - datetime.timedelta(days = 1) >>> print(dt2) 2018-03-10 15:34:26.853515 >>> dt3 = dt + datetime.timedelta(days = 1) >>> print(dt3) 2018-03-12 15:34:26.853515 >>> delta_obj = dt3 - dt >>> print(type(delta_obj)) <class 'datetime.timedelta'> >>> print(delta_obj) 1 day, 0:00:00 >>> print(delta_obj.days, delta_obj.total_seconds()) 1 86400.0
5、tzinfo时区类
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(2018,3,11,15,30,0,tzinfo = UTC(8))
print("beijing time:",beijing)
#曼谷时间
bangkok = datetime(2018,3,11,15,30,0,tzinfo = UTC(7))
print("bangkok time",bangkok)
#北京时间转成曼谷时间
print("beijing-time to bangkok-time:",beijing.astimezone(UTC(7)))
#计算时间差时也会考虑时区的问题
timespan = beijing - bangkok
print("时差:",timespan)
#####
执行结果:
beijing time: 2018-03-11 15:30:00+08:00
bangkok time 2018-03-11 15:30:00+07:00
beijing-time to bangkok-time: 2018-03-11 14:30:00+07:00
时差: -1 day, 23:00:00
浙公网安备 33010602011771号