Pyhton——时间模块详解
Pyhton——时间模块详解
Python中提供了多个用于对日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块。其中time模块是通过调用C库实现的,所以有些方法在某些平台上可能无法调用,但是其提供的大部分接口与C标准库time.h基本一致。time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。
我们先看关于表示时间的几种方法
- UTC time 世界协调时,又称格林尼治时间,世界标准时。与UTC对应各个时区的localtime,北京东八区比UTC早8小时,所以用UTC+8表示
- epoch time 表示时间开始的起点;它是一个特定的时间,不同平台上这个时间点的值不太相同,对于Unix而言,epoch time为 1970-01-01 00:00:00 UTC
- timestamp(时间戳) 也称为Unix时间 或 POSIX时间;它是一种时间表示方式,表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但是有些编程语言的相关方法返回的是秒数(Python就是这样),这个需要看方法的文档说明。需要说明的是时间戳是个差值,其值与时区无关。
- 元组(struct_time) struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。
time模块
下面我们通过几个常用的实例详细介绍struct_time 中的属性
import time
# time.localtime() :将一个时间戳转换为当前时区的struct_time
time.localtime()
#可以看到里面有9个元素
# tm_wday=2 代表周二
# tm_yday=73 代表一年中的第73天
# tm_isdst=0 代表是否是夏令时,可取0,1,-1 取不同值可能会影响性能
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=14, tm_hour=0, tm_min=24, tm_sec=59, tm_wday=2, tm_yday=73, tm_isdst=0)
t = time.time() #返回当前时间的时间戳
print(t)
print('-------')
time.sleep(1) #线程推迟指定的时间运行,单位为秒。
print('hello,一秒后输出')
1520959413.8214176
-------
hello,一秒后输出
t = time.gmtime()#将一个时间戳转换为UTC时区(0时区)的struct_time。
print(t)
print('------------')
t1 = time.mktime(time.localtime()) #将一个struct_time 转化为时间戳
print(t1)
time.struct_time(tm_year=2018, tm_mon=3, tm_mday=13, tm_hour=16, tm_min=43, tm_sec=19, tm_wday=1, tm_yday=72, tm_isdst=0)
------------
1520959399.0
t = time.asctime()
print(t)
# 把一个表示时间的元组或者struct_time表示为这种形式:
# 'Sun Jun 20 23:21:05 1993'。如果没有参数,将会将time.localtime()作为参数传入。
print('----------')
t1 = time.ctime()
print(t1)
#把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。
#如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
Wed Mar 14 00:44:22 2018
----------
Wed Mar 14 00:44:22 2018
print(time.strftime('%Y-%m-%d',time.localtime()))
'''
返回字符串表示的当地时间。
把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串,
格式由参数format决定。如果未指定,将传入time.localtime()。如果元组中任何一个元素越界,就会抛出ValueError的异常。
函数返回的是一个可读表示的本地时间的字符串。
参数:
format:格式化字符串
t :可选的参数是一个struct_time对象
'''
2018-03-14
格式化字符 | 字符含义 |
---|---|
%a | 本地(locale)简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化月份名称 |
%B | 本地完整月份名称 |
%c | 本地相应的日期和时间表示 |
%d | 一个月中的第几天(01 - 31) |
%H | 一天中的第几个小时(24小时制,00 - 23) |
%I | 第几个小时(12小时制,01 - 12) |
%j | 一年中的第几天(001 - 366) |
%m | 月份(01 - 12) |
%M | 分钟数(00 - 59) |
%p | 本地am或者pm的相应符(“%p”只有与“%I”配合使用才有效果) |
%S | 秒(01 - 61)(文档中强调确实是0 - 61,而不是59,闰年秒占两秒) |
%U | 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。 |
%w | 一个星期中的第几天(0 - 6,0是星期天) |
%W | 和%U基本相同,不同的是%W以星期一为一个星期的开始。 |
%x | 本地相应日期 |
%X | 本地相应时间 |
%y | 去掉世纪的年份(00 - 99) |
%Y | 完整的年份 |
%Z | 时区的名字(如果不存在为空字符) |
%% | ‘%’字符 |
当使用strptime()函数时,只有当在这年中的周数和天数被确定的时候%U和%W才会被计算
综上,time模块总共有三种时间表达方式:
- timestamp 时间戳
- tuple 或者 struct_time
- 格式化字符串
更多相关请查阅 time模块官方文档
datetime模块
datetime是基于time模块封装的,是date和time模块的合集,但是执行效率略低。datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1。
datetime里有四个重要的类:
- date :表示日期,年月日
- datetime :表示日期时间,年月日时分秒
- time :表示时间,时分秒
- timedelta :表示时间间隔
datetime的date类
# datetime.date(year,month,day): 返回 year-month-day
# import datetime
from datetime import date
today = datetime.date.today() # datetime.date.today 返回今日
print(today,type(today))
# 输出格式为 date 类
print(str(today),type(str(today)))
t = datetime.date(2016,1,22)
print(t)
# (年,月,日) → 直接得到当时日期
2018-03-14 <class 'datetime.date'>
2018-03-14 <class 'str'>
2016-01-22
datetime的time类
time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo五部分组成
# datetime.time
t1 =datetime.time(2,22,33,9)
print(t1,type(t1))
t2 = t1.strftime('%H:%M:%S')
print(t2,type(t2))
# 把一个datetime.time 类 转化为 str
02:22:33.000009 <class 'datetime.time'>
02:22:33 <class 'str'>
datetime的datetime类
datetime类其实是可以看做是date类和time类的合体,其大部分的方法和属性都继承于这二个类
# datetime.datetime: datetime对象
now = datetime.datetime.now()
print(now,type(now))
#输出datetime类
t1 = datetime.datetime(2016,6,1)
t2 = datetime.datetime(2014,1,1,12,44,33)
print(t1)
print(t2)
# (年,月,日,时,分,秒),至少输入年月日
t2 - t1
# 相减得到时间差 —— timedelta
2018-03-14 22:53:11.224884 <class 'datetime.datetime'>
2016-06-01 00:00:00
2014-01-01 12:44:33
datetime.timedelta(-882, 45873)
时间差 timedelta
# datetime.timedelta 时间差
today = datetime.datetime.today()
yestoday = today + datetime.timedelta(-1) # -1 代表前一天
print(today)
print(yestoday)
print(today - datetime.timedelta(7))
# 时间差主要用作时间的加减法,相当于可被识别的时间“差值”
2018-03-13 21:35:31.238277
2018-03-12 21:35:31.238277
2018-03-06 21:35:31.238277
日期字符转换 parser.parse
# parser.parse:日期字符转换
from dateutil.parser import parse
date = '12-23-2018'
date1 = '13/3/2018'
print(parse(date),type(parse(date)))
print(parse(date1))
# 直接将几乎任何类似时间格式的str转化成datetime.datetime
print(parse('2000-1-1'),'\n',
parse('5/1/2014'),'\n',
parse('5/1/2014', dayfirst = True),'\n', # 国际通用格式中,日在月之前,可以通过dayfirst来设置
parse('22/1/2014'),'\n',
parse('Jan 31, 1997 10:45 PM'))
# 各种格式可以解析,但无法支持中文
2018-12-23 00:00:00 <class 'datetime.datetime'>
2018-03-13 00:00:00
2000-01-01 00:00:00
2014-05-01 00:00:00
2014-01-05 00:00:00
2014-01-22 00:00:00
1997-01-31 22:45:00