Python语言中与时间有关的模块主要是:time,datetime,calendar
time模块中的大多数函数是调用了所在平台C library的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。
另外一点是,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 - 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用datetime模块更好。
名词解释:UTC时间
UTC时间(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令时
Python中时间有3种表现方式,分别是:
1.时间戳
时间戳表示的是从1970年1月1日 00:00:00开始到现在时间的偏移量,以秒计算的值(float类型)。返回时间戳方式的方法主要有time(),clock()等。
time()方法返回的值:从纪元开始(1970年1月1日 00:00:00)以秒为单位的当前UTC时间(float类型)
>>> time.time() #返回当前UTC时间的时间戳
1510885126.5995045
clock()方法返回的值:
首先关于这个方法的注释是这样写的:
Return the CPU time or real time since the start of the process or since
the first call to clock(). This has as much precision as the system
records.
clock翻译过来的意思就是 计时器
precision翻译过来的意思就是 精确
这两个单词很好的表达了这个方法所实现的功能。
clock()方法,在不同的系统上含义不同。 在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。
而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次 之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为 精确)
>>> time.clock()
3.5378305527754105e-06
>>> time.clock()
5.703646194302607
>>> time.clock()
17.30329184519444
第一个clock()输出的是程序运行时间
第二、三个clock()输出的都是与第一个clock的时间间隔
2.struct_time(元组格式的时间对象)
struct_time元组共有9个元素,返回struct_time时间对象的方法主要有 gmtime()、localtime()、strptime()。
下图表示struct_time元组包含的9个元素分别表示什么含义:
tm_wday(weekday)的值是:0~6(0表示周日)
gmtime([secs])方法将一个时间戳转换为 UTC时间的struct_time时间对象格式。没有参数时,默认当前时间
>>> time.gmtime()
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=17, tm_hour=2, tm_min=29, tm_sec=35, tm_wday=4, tm_yday=321, tm_isdst=0)
localtime([secs])方法将一个时间戳转换为 当前时区的struct_time时间对象格式。没有参数时,以当前时间为准
>>> time.localtime()
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=17, tm_hour=10, tm_min=29, tm_sec=42, tm_wday=4, tm_yday=321, tm_isdst=0)
strptime()方法将一个时间字符串转换为struct_time时间对象格式。和strftime()是逆操作
>>> time.strptime("2017/11/17","%Y/%m/%d")
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=17, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=321, tm_isdst=-1)
3.格式化的字符串
strftime(format[,t])方法将一个struct_time时间对象格式的时间 转换为格式化的时间字符串。如果t未指定,将传入time.localtime()。
>>> time.strftime("%Y-%m-%d %H:%M:%S") #未指定t参数
'2017-11-17 11:30:13'
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) #指定 t参数为UTC时间
'2017-11-17 03:33:15'
如果struct_time元组中的任何一个元素越界,将会抛出ValueError的错误。
格式对照表:
其它方法:
time.sleep([secs]):线程推迟指定的时间运行。单位为秒
time.asctime([t]) 将一个表示时间的struct_time表示为"'Fri Nov 17 11:42:02 2017'"这种 形式。如果没有参数,会把time.localtime()作为参数传入
>>> time.asctime()
'Fri Nov 17 11:42:02 2017'
>>> time.asctime(time.localtime())
'Fri Nov 17 11:42:31 2017'
time.ctime([secs])把一个时间戳转换为time.asctime()的形式。如果没有参数,会把time.time()作为参数传入。它的作用相当于
time.asctime(time.localtime())
>>> time.ctime()
'Fri Nov 17 11:40:07 2017'
>>> time.ctime(time.time())
'Fri Nov 17 11:40:54 2017'
晕,为什么使用 time.ctime(time.time())方法会得到当前时区的时间。明明time.time()方法返回的时间戳表示 UTC时间的。
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time()))
'2017-11-17 03:46:59'
>>> time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time()+28800))
'2017-11-17 11:54:19'
28800表示8个小时(中国时间为 UTC时间+8小时)
暂且先把这个问题记在这里。
关于时间模块,这些只是最基础的应用。如何合理使用这些方法才是最应该学习的。