python中我们很常用到time和datetime这两个库,包括但不限于时间戳的转换,程序运行时间的计算。
这两个类在python doc中是处于不同模块的
time属于Generic Operating System Services,与os,io等并列
datetime属于Data Types,与collections,array,enum等并列
单从这样看,time应该是属于系统上的时间操作,
而datetime是属于一种数据结构,即将time做了一层封装,实现一些复杂的功能或输出。这一点从datetime中from time import struct_time
就可以看出来
>>> time.time()
1517025906.869067
>>> datetime.datetime.now()
datetime.datetime(2018, 1, 27, 12, 5, 8, 383099)
time打出的是unix的时间戳,即1970年1月1日到现在过的second,datetime打印的是一个相对可以理解output
2. 格式转换
strptime用于生成时间组,strftime用于把时间组转成特定格式, 常搭配使用更改时间的格式,这方面time和strftime用法基本类似,只是time是用类方法,而datetime用的是对象本身的方法,中间产生的结果也不太一样
>>> time.strftime("%Y/%m/%d %H:%M:%S",time.strptime('2018-1-27 12:05:08',"%Y-%m-%d %H:%M:%S"))
'2018/01/27 12:05:08'
>>> datetime.datetime.strptime('2018-1-27 12:05:08', "%Y-%m-%d %H:%M:%S").strftime("%Y/%m/%d %H:%M:%S")
'2018/01/27 12:05:08'
>>> d =datetime.datetime.strptime('2018-1-27 12:05:08', "%Y-%m-%d %H:%M:%S")
>>> t = time.strptime('2018-1-27 12:05:08',"%Y-%m-%d %H:%M:%S")
>>> d
datetime.datetime(2018, 1, 27, 12, 5, 8)
>>> t
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=27, tm_hour=12, tm_min=5, tm_sec=8, tm_wday=5, tm_yday=27, tm_isdst=-1)
可以看到time多了一个tm_wday, tm_yday还有,tm_isdst
tm_wday(weekday) 0 - 6(0表示周日)
tm_yday(一年中的第几天) 1 - 366
tm_isdst(是否是夏令时) 默认为-1
看到夏令时就知道这是美帝的时间了,所以今天明明是周六,却打出了tm_min,是因为美帝还没到新一天
3.unix时间戳转换
>>> time.localtime(time.time())
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=27, tm_hour=12, tm_min=35, tm_sec=8, tm_wday=5, tm_yday=27, tm_isdst=0)
>>> datetime.datetime.utcfromtimestamp(time.time())
datetime.datetime(2018, 1, 27, 4, 35, 13, 133339)
要忽略小数点后的可以做个int转换
>>> datetime.datetime.utcfromtimestamp(int(time.time()))
datetime.datetime(2018, 1, 27, 4, 36, 28)
4.转成unix时间
>>> t
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=27, tm_hour=12, tm_min=5, tm_sec=8, tm_wday=5, tm_yday=27, tm_isdst=-1)
>>> time.mktime(t)
1517025908.0
5.两者转换
>>> d
datetime.datetime(2018, 1, 27, 12, 5, 8)
>>> d.timetuple()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=27, tm_hour=12, tm_min=5, tm_sec=8, tm_wday=5, tm_yday=27, tm_isdst=-1)
datetime并不能做一些系统相关操作,而time可以,比如sleep 方法,就是让该线程/进程挂起一段时间。
但是time只能处理unix时间,即从Epoch开始,如果操作系统是32位,去调标识位,2^31/3600/24/365=68
只够用到2038年,要注意这一点