时间相关模块和函数
基本概念
在python中与时间处理相关的模块有:time、datatime和calender
在python中表示时间的方式有:时间戳、格式化的时间字符串、元祖(struct_time共9种元素)。由于time模块主要是调用c库实现的,所以在不同的平台可能会不同。
- 时间戳(timestamp):表示从1970年1月1号00:00:00开始到现在按秒计算的偏移量。tick单位(系统的相对时间,间隔以秒为单位的浮点数)最适合做日期运算。但是1970年之前的时间无法表示,UNIX和win都只支持到2038年某日。 type(time.time())返回的是float类型,返回时间戳的函数主要有time()、clock()等
- UTC(世界协调时),就是格林威治天文时间。在中国为UTC+8,DST夏令时。
- 元祖方式:struct_time共有9个元素,返回struct_time的函数主要有gmtime()、localtime()、strptime()
time模块
- 时间元祖
- 属性:
序号 |
属性 |
值 |
说明 |
1 |
tm_year |
2008 |
4位数的年份 |
2 |
tm_mon |
1-12 |
月份 |
3 |
tm_mday |
1-31 |
日 |
4 |
tm_hour |
0-23 |
时 |
5 |
tm_min |
0-59 |
分钟 |
6 |
tm_sec |
0-61(60或61是闰秒) |
秒 |
7 |
tm_wday |
0-6(0是周一) |
一周的第几天 |
8 |
tm_yday |
1-366(日历) |
一年的第几天 |
9 |
tm_isdst |
-1,0,1 |
其中-1是决定是否为夏令时 |
- 代码示例1:时间元祖
import time
'''时间元祖'''
ls=time.localtime()
print(ls)#时间元祖
#直接使用元祖索引获取对应的属性值
print('year:',ls[0])
print('month:',ls[1])
print('day:',ls[2])
#使用成员符号调用
print('year:',ls.tm_year)
- 代码示例2:格林威治时间
import time
ls=time.gmtime()
print(ls)
- time.time():返回当前时间的时间戳
注意:返回的是float类型
- 代码示例:
import time
print(time.time()) #表示当前时间距离1970年1月1日的秒数
print(int(time.time())) #对时间戳取整
- time.localtime():将时间戳转换为当前时间的时间元祖
命令格式:time.localtime([secs])
参数说明:secs--是一个秒数,将其转换为time.struct_time类型的对象,不写secs的话默认将当前时间作为参数(即time.time())
- 代码示例:
- time.gmtime():将时间戳转换为UTC时区的时间元祖
命令格式:time.gmtime([secs])
参数说明:secs--是一个秒数,将其转换为UTC时区(0时区)time.struct_time类型的对象,不写secs的话默认将当前时间作为参数(即time.time())
- 代码示例:
- time.mktime():将struct_time转换为时间戳
与gmtime()和localtime()相反,接收struct_time类型的参数,返回浮点数表示的秒数,如果输入的不是合法的时间,会触发OverflowError或ValueError异常
命令格式:time.gmtime(t])
参数说明:secs--是一个秒数,将其转换为UTC时区(0时区)time.struct_time类型的对象,不写secs的话默认将当前时间作为参数(即time.time())
- 代码示例:
st=time.localtime()
print(st)
print(time.mktime(st))
- time.sleep():睡眠函数
命令格式:time.sleep(seccs)
参数说明:secs--是一个秒数
- 代码示例:
time.sleep(10)#睡眠10秒钟
- time.clock():睡眠函数
以浮点数计算的秒数返回当前的CPU时间,用来衡量不同程序的耗时, 比time.time()更有用.返回的是当前处理器时间作为Unix上以秒为单位的浮点数。
- 代码示例:
'''sleep clock'''
def procedure():
time.sleep(5)
time1=time.clock()
procedure()
print(time.clock()-time1,'seconds process time!')
#利用time.time()来计算耗时
time2=time.time()
procedure()
print(time.time()-time2,'seconds!')
- time.strftime():返回字符串表示的当地时间
把一个代表时间的元祖或者struc_time(如由time.localtime()或time.gmtime()返回)转化为格式化的时间字符串,格式由参数format决定;没有指定的话,将传入time.localtime();如果元祖中任何一个元素越界会跑出ValueError异常;函数返回的是一个可读表示的本地时间字符串。
命令格式:time.strftime(format,[t])
参数说明:format--是一个格式化字符串
t:可选的参数,是一个struc_time对象
- 时间字符串的格式化符号:
符号 |
说明(区分大小写) |
%a |
本地星期名称的简写(如星期四为Thu) |
%A |
本地星期名称的全称(如星期四为Thursday) |
%b |
本地月份名称的简写(如八月份为agu) |
%B |
本地月份名称的全称(如八月份为aguust) |
%c |
本地相应的日期和时间的字符串表示(如:15/08/27 10:20:06) |
%d |
一个月中的第几天(01-31) |
%H |
一天中的第几个小时(24小时制,00-23) |
%I |
第几个小时(12小时制,0 -11) |
%j |
一年中的第几天(001 -366) |
%m |
月份(01-12) |
%M |
分钟数(00-59) |
%p |
%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 |
时区的名字(如果是本地时间,返回空字符串) |
%% |
“%”字符 |
- 代码示例1:'''strftime'''
#获取当前时间的struct_time对象
ft=time.localtime()
#格式化字符串
st=time.strftime('%Y-%m-%d %H:%M:%S',ft )
print(st)
- 代码示例2:'''直接使用字符串拼接成格式时间字符串'''
#获取当前时间的struct_time对象
ft=time.localtime()
#直接使用字符串拼接成格式时间字符串
print(str(ft.tm_year)+'年'+str(ft.tm_mon)+'月'+str(ft.tm_mday)+'日'+
str(ft.tm_hour)+'时'+str(ft.tm_min)+'分'+str(ft.tm_sec)+'秒')
- 代码示例3:将当前时间的时间戳转换成想要的时间格式字符串
import locale
locale.setlocale(locale.LC_CTYPE,'chinese')#设定当时
st=time.strftime('%Y年-%m月-%d日 %H:%M:%S',time.localtime() )
print(st)
- 代码示例4:获取当前时间的年月日时分秒
- 代码示例5:拼接自定义的日期
now = time.localtime()
print (now)
#获取当前时间的格式化时间
print (time.strftime('%Y-%m-%d %H:%M:%S', now))
#星期的简写
print (time.strftime('%a', now))
#星期的全写
print (time.strftime('%A', now))
#月份的简写
print (time.strftime('%b', now))
#月份的全写
print (time.strftime('%B', now))
#得到日期时间的字符串
print (time.strftime('%c', now))
#日期字符串
print (time.strftime('%x', now))
#时间字符串
print (time.strftime('%X', now))
#今天是今年的第几天
print (time.strftime('%j', now))
#这周是星期几
print (time.strftime('%w', now))
#这周是今天的第几周
print (time.strftime('%U', now))
- time.strptime():将格式化字符串转换成struct_time
time.strftime()的逆操作,返回的是一个struc_time对象
命令格式:time.strftime(string,format)
参数说明:string--时间字符串
format--是一个格式化字符串
- 代码示例:
stime='2017-07-07 12:12:12'
#通过strptime()函数将stime转化成strcut_time形式
ft=time.strptime(stime,'%Y-%m-%d %H:%M:%S')
print(ft)
#遍历返回的时间元祖
for i in ft:
print(i)
datetime模块
是基于time包的一个高级包。datetime可以理解为date和time两个部分组成:date指年月日构成的日期(相当于日历),time是指时分秒微秒构成的一天24小时中的具体时间(相当于手表)。由此可以将这两个分开管理(datetime.date类, datetime.time类),也可以将两者合并在一起(datetime.datetime类)。下面就分别介绍一 下datetime模块中的这几个类。
- 引入datetime模块
import datetime(或from datetime import *)
datetime模块定义了两个常量:
datetime.MINYEAR :最小年份,MINYEAR = 1。
datetime.MAXYEAR:最大年份。MAXYEAR = 9999。
- datetime模块常用的几个类
datetime.date:日期类。常用的属性有year,month,day;
datetime.time:时间类。常用的属性有hour,minute,second,microsecond; datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
datetime.tzinfo:与时区有关的信息。
- date类的常用方法
- 构造函数:
date类是一个日期类,由年、月、日组成,该类的构造函数如下:
class datetime.date(year, month, day):
参数说明:year--表示年,范围(MINYEAR, MAXYEAR],即[1, 9999]
month--表示月,范围[1, 12]
day--某个月中第几天,最大值根据给定的year,month参数来决定。例如闰年2 月份有29天
- 代码示例:date对象所能表示的最大和最小日期,返回的是datetime.date类型对象
- date.today():表示当前今天日期的date对象
- date.fromtimestamp():根据给定的时间戳返回一个date对象
- 代码示例:
import datetime
import time
#获取当前时间的时间戳
now=time.time()
print(now)
#将时间戳转换为date类型的时间
s=datetime.date.fromtimestamp(now)
print (s)
- date.weekday():返回weekday中的星期几
注意:星期一,返回0;星期二,返回1,以此类推
函数格式:date.weekday(s)
参数说明:s--datetime.date类型的参数
- 代码示例:
- date.isoweekday():返回weekday中的星期几
注意:星期一,返回1;星期二,返回2,以此类推
函数格式:date.isoweekday(s)
参数说明:s--datetime.date类型的参数
- 代码示例:
now=datetime.date.today()
print(now)
print(datetime.date.isoweekday(now))
- date.isocaendar():返回时间对象的year/week/weekday(工作日)
函数格式:date.isocalendar(s)
参数说明:s--datetime.date类型的参数
- 代码示例:
now=datetime.date.today()
print(datetime.date.isocalendar(now))
- date.strftime():返回自定义的格式时间字符串
函数格式:date.strftime(format)
参数说明:format--自定义的时间格式
- 代码示例:
now=datetime.date.today()
print(now.strftime('%Y-%m-%d %H:%M:%S'))
- 日期加上一个时间间隔
dateNow = dateOld + timedelta #timedelta表示时间间隔,后面会介绍。
日期加上一个间隔,返回一个新的日期对象。
- 代码示例:
today=datetime.date.today() #获取今天的日期
print(today+datetime.timedelta(days=10)) #今天的日期加上10天
- 日期减去一个时间间隔
dateNow = dateOld - timedelta #timedelta表示时间间隔,后面会介绍。
日期减去一个间隔,返回一个新的日期对象。
- 代码示例:
today=datetime.date.today() #获取今天的日期
print(today-datetime.timedelta(days=10)) #今天的日期之前的10天
- 两个日期相减
timedelta = date1- date2
返回两个日期间的间隔对象
- 代码示例:
today=datetime.date.today() #获取今天的日期
print(today)
future=today.replace(day=15) #替换形成一个新的日期
print(future)
print(future-today) #计算新旧日期的间隔
- 比较日期大小
date1 < date2 返回比较结果布尔值,真返回True,假返回False
- 代码示例:
today=datetime.date.today()
print(today)
future=today.replace(day=15)
print(future)
print(future>today)
print(future<today)
- time类的常用方法
- 构造函数
time类是一个时间类,由时、分、秒、微秒组成,该类的构造函数如下:
class datetime.time([hour[,minute[,second[,microsecond[,tzinfo]] ]]]) :
参数说明:hour--表示小时,范围[0,24)
minute--表示分,范围[0,60)
second--表示秒,范围[0,60)
microsecond--表示微秒,范围[0, 1000000)
tzinfo--表示时区信息。
time.min:代表time类所能表示的最小时间
time.max:代表time类所能表示的最大时间
- 代码示例:
print(datetime.time.min)
print(datetime.time.max)
- time类的属性-hour、minute、second、 microsecond
- 代码示例:
tm=datetime.datetime.now() #注意在datetime类中
print(tm)
print(tm.hour)
print(tm.minute)
print(tm.second)
print(tm.microsecond)
- time.isoformat():返回格式如:HH:MM:SS的时间字符串
- 代码示例:
tm=datetime.time(12,12,00)
print(tm)
tm1=tm.isoformat()
print(tm1)
- time.strftime():返回自定义格式的时间字符串
- 代码示例:
tm=datetime.time(12,12,00)
print(tm)
print(tm.strftime('%H-%M-%S'))
- datetime类的常用方法
datetime类是date和time的结合体,包括date与time的所有信息, date和time类中具有的方法和属性,datetime类都具有。所以在我们 日常的工作中,可以仅使用datetime类。由于datetime类是date和time两部分组成的,所以其很多的实例方 法与属性都跟date和time都一样的
- 构造函数:
datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
参数说明:和date/time类的构造函数一样
- datetime.today():返回当前本地时间的datetime对象
- datetime.now(tz):返回当前本地时间的datetime对象
tz指定时区信息,不传的话默认本地时区
- 代码示例:
today=datetime.datetime.now()
print(today)
print(today.year)
print(today.month)
print(today.day)
print(today.hour)
print(today.minute)
print(today.second)
print(today.microsecond)
- datetime.fromtimestamp(tz):根据时间戳返回datetime对象
tz指定时区信息,不传的话默认本地时区
- 代码示例:
import time
import datetime
t=time.time()
print (t)
##将时间戳转换为一个datetime对象
datetimes=datetime.datetime.fromtimestamp(t)
print(datetimes)
print(type(datetimes))
print(str(datetimes))
- datetime.strptima(string,format):将字符中转为datetime对象
- 代码示例:
print(datetime.datetime.strptime('2018-07-21 14:01:10','%Y-%m-%d %H:%M:%S'))
- datetime类的属性-year、month、day、hour、minute、second
- 代码示例:
t=datetime.datetime.now()
print('当前的日期和时间是%s'%t)
print('当前的年份是%s'%t.year)
print('当前的月份是%s'%t.month)
print('当前的日期是%s'%t.day)
print('dd/mm/yyyy 格式是 %s/%s/%s' % (t.day, t.month, t.year) )
print('当前的小时是%s'%t.hour)
print('当前的分钟是%s'%t.minute)
print('当前的秒是%s'%t.second)
- datetime.date():获取时间中的日期对象date
- 代码示例:
dates=datetime.datetime.date(datetime.datetime.today())
print(dates)
print(type(dates))
print(dates.year)
- datetime.time():获取时间中的时间对象time
- 代码示例:
dates=datetime.datetime.time(datetime.datetime.today())
print(dates)
print(dates.hour)
- datetime.combine():根据date和time创建datetime对象
datetime.combine(date,time):
参数说明:date--是datetime.date对象
time--是datetime.time对象
- 代码示例:
import datetime
print(datetime.datetime.combine(datetime.datetime.today(),datetime.time(18,1
2,35)))
- datetime.repace():替换原有时间,获得新的日期时间
datetime.replace([year[,month[,day[,hour[,minute[,second[,microsecond[,tzinfo]]]]]]]])
- 代码示例:
times=datetime.datetime.today()
print(times)
tmp=times.replace(year=1998,hour=23)
print(tmp)
- time.mktime():将datetime对象转换成时间戳
datetime.mktime(strcut_time)
- 代码示例:
import time
import datetime
#获得当前时间的datetime对象
t=datetime.datetime.now()
print(t)
#根据当前时间的datetime对象获取当前时间的时间元组
struct_time=t.timetuple()
print(struct_time)
#根据当前时间的时间元组获得当前时间的时间戳
timestamp=time.mktime(struct_time) #注意是time类中的方法
#对时间戳取整
timestamp = int(timestamp)
print (timestamp)
- time.weekday(time):返回一周中的星期几
参数time是一个datetime.date类型的数据。返回weekday中的 星期几,星期一,返回0;星期二,返回1;以此类推。
- 代码示例:
now=datetime.datetime.now()
print(now)
print(datetime.datetime.weekday(now))
- time.isocaendar(time):以元祖形式返回年月日
参数time是一个datetime.date类型的数据。
- 代码示例:
now=datetime.datetime.now()
print(now)
print(datetime.datetime.isocalendar(now))
- time.strftime(format):返回自定义的格式时间字符串
- 代码示例:
import datetime
now=datetime.datetime.now()
print(now)
#获取当前时间的格式化时间字符
print(now.strftime(('%Y-%m-%d %H:%M:%S %f')))
print(now.strftime(('%y-%m-%d %I:%M:%S %p')))
#星期的简写
print (now.strftime('%a'))
#星期的全写
print (now.strftime('%A'))
#月份的简写
print (now.strftime('%b'))
#月份的全写
print (now.strftime('%B'))
#得到日期时间的字符串
print (now.strftime('%c'))
#得到日期的字符串
print (now.strftime('%x'))
#得到时间的字符串
print (now.strftime('%X'))
#今天是星期几
print (now.strftime('%w'))
#今天是今年的第几天
print (now.strftime('%j'))
#今天是今年的第几周
print (now.strftime('%U'))
- timedelta类的常用方法
datetime.timedelta类对象代表两个时间之间的时间差,两个date或 datetime对象相减就可以返回一个timedelta对象。
- 构造函数:
class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
参数说明:所有的参数都是可选的,并且默认是0;
参数的值可以是整数、浮点数、整数或负数
针对时间存储,timedelta内部职能存储days、seconds、microseconds,其它值自动按如下规则转换:
1 millisecond(毫秒)转换成 1000 microseconds(微秒)
1 minute 转换成 60 seconds
1 hour 转换成 3600 seconds
1 week转换成 7 days
- 代码示例:
- 两个日期的时间相减:
- 代码示例:
import datetime
#求两个日期间的天数差
t1=datetime.datetime(2017,12,30)
t2=datetime.datetime(2018,8,9)
print((t2-t1).days) #得到的是datetime.timedelta时间对象,代表两个时间之差
- 日期或时间加上或减去一个时间间隔:
加上或减去的时间间隔是通过加减timedelta对象中的属性值给定的值实现的
- 代码示例1:计算明天此时的时间
import datetime
#获得当前时间的datetime对象
now=datetime.datetime.now()
print('当前的时间为:',now)
#设定一个时间间隔,间隔为1天
delta=datetime.timedelta(days=1)
newTime=now+delta
print('明天的时间为:',newTime)
##得到明天的时间
print(str(newTime)[:-7])
#使用格式化函数得到明天的时间
print(newTime.strftime('%Y-%m-%d %H:%M:%S'))
#减1天
delta=datetime.timedelta(days=-1)
newTime=now+delta
print('昨天的时间为:',newTime)
- 代码示例2:计算100天前的日期
import datetime
#获得当前时间的datetime对象
now=datetime.datetime.now()
print('当前的时间为:',now)
#设定100天前的时间间隔
delta=datetime.timedelta(days=-100)
#得到100天前的时间
newTime=now+delta
print('100天前的时间为:',newTime)
#使用格式化函数得到明天的时间
print(newTime.strftime('%Y-%m-%d'))
- 代码示例3:计算3小时前的时间
import datetime
print(datetime.datetime.now()+datetime.timedelta(hours=-3))
- timedeta.total_seconds():获取总秒数
- 代码示例:
print(datetime.timedelta(hours=2,seconds=30).total_seconds())
- calenda类的常用方法
calendar就是日历模块,提供了一些操作日期、生成日历的方法
- calendar.Calendar(firstweekday=0)
该类提供了许多生成器,如星期的生成器,某月日历生成器。
- calendar.TextCalendar(firstweekday = 0)
该类提供了按月、按年生成日历字符串的方法。
- calendar.HTMLCalendar(firstweekday = 0)
类似TextCalendar,只是生成器是HTML格式日历。
- caendar.day_name:星期的全称
- caendar.day_abbr:星期的简称
- caendar.month_name:月的全称
- caendar.month_abbr:月的简称
- caendar.isleap(year):判断是否为闰年
判断某年是否为闰年,如果是返回True,否则返回False
- caendar.month(year,month,w=2,I=1):返回指定年的某月
返回一个多行字符串格式的年月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度 为7* w+6。l是每星期的行数。
- caendar.calendar(year,w=2,I=1,c=6):返回指定年的日历
返回一个多行字符串格式的年历,3个月一行, 间隔距离为c。每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。 返回指定年的日历,按日历格式返回一年12个月的日历。
- caendar.HTMLCalendar():返回指定年的日历,htm格式
'''HTMLCalendar'''
import calendar
myCal=calendar.HTMLCalendar(calendar.SUNDAY)
print(myCal.formatmonth(2018,7))
with open('calendar.html','w') as fp:
fp.write(myCal.formatmonth(2018,7))