关于时间和日期模块
python程序能用很多方式处理日期和时间,转换日期格式是一种常见的功能。
python提供了一个time和calendar模块可以用于格式化日期和时间。
时间间隔是以秒为单位的浮点小数
每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。
python的time模块下有很多函数可以转换常见的日期格式。
一、Time模块
1.1 名词解释
UTC :格林威治天文时间,世界标准时间,在中国为UTC-8
DST:夏令时是一种节约能源而人为规定的时间制度,在夏季调快一小时.
1.2 时间的表示形式
1.时间戳
以整数或浮点型表示的是一个秒为单位的时间间隔,这个时间的基础值1970.1.1的零点开始算起
2.元组格式
采用python的数据结构表示,这个元组有9个整型内容,分别表示不同含义
year month day hours minutes seconds weekday Julia day(儒略日(天文时间)) flag[标记夏令时]
3.格式化字符串
eg : %Y 完整年份
获取当前时间
1、time.clock()
以浮点数计算秒数,返回程序运行的时间。
用处:可用来计算一段程序运行的时间。
2、time.sleep(seconds)
程序休眠seconds再执行下面的语句。单位s
3、time.time() 时间戳
返回一个浮点型数据
格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。
4、time.gmtime(时间戳)
把时间戳转成格林威治时间,返回一个时间元组
import datatime
import time
time1 = time.time()
gm = time.gmtime(time1)
print(gm)
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=15, tm_hour=6, tm_min=22, tm_sec=45, tm_wday=6, tm_yday=196, tm_isdst=0(是否为夏令时))
5、time.localtime(时间戳)
把时间戳转成本地时间,返回一个时间元组。(如中国时区,加上8个小时)
time1 = time.time()
lm = time.localtime(time1)
print(lm)
6、time.asctime(时间元组)
将时间元组转成一个字符串。
lm2 = time.localtime(1531650143)
st = time.asctime(lm2)
print(st)
输出:
Sun Jul 15 18:22:23 2018
7、time.ctime(时间戳)
将时间戳转成一个字符串。
time1 = time.time()
ct = time.ctime(time1)
print(ct)
8、time.strftime(format,时间元组)
将时间元组转成指定格式的字符串。
time1 = time.time()
lm = time.localtime(time1)
sct = time.strftime("%Y-%m-%d %X",lm)
print(sct)
输出:2018-07-15 15:18:35
二、date类
(一)、date对象构成
1、date对象由year年份、month月份及day日期三部分构成:
date(year,month,day)
2、 通过year, month, day三个数据描述符可以进行访问:
>>> a = datetime.date.today()
>>> a
>>> a.year
>>> a.month
>>> a.day
3、当然,你也可以用__getattribute__(...)方法获得上述值:
>>> a.__getattribute__('year')2018
>>> a.__getattribute__('month')7
>>> a.__getattribute__('day')15
(二)、date对象中包含的方法与属性
1、用于日期比较大小的方法
方法名 |
方法说明 |
用法 |
__eq__(…) |
等于(x==y) |
x.__eq__(y) |
__ge__(…) |
大于等于(x>=y) |
x.__ge__(y) |
__gt__(…) |
大于(x>y) |
x.__gt__(y) |
__le__(…) |
小于等于(x<=y) |
x.__le__(y) |
__lt__(…) |
小于(x<=y) |
x.__lt__(y) |
__ne__(…) |
不等于(x!=y) |
x.__ne__(y) |
以上方法的返回值为True\False
示例如下:
>>> a=datetime.date(2018,7,1)
>>> b=datetime.date(2018,7,15)
>>> a.__eq__(b)False
>>> a.__ge__(b)False
>>> a.__gt__(b)False
>>> a.__le__(b)True
>>> a.__lt__(b)True>
>> a.__ne__(b)True
2、获得二个日期相差多少天
使用__sub__(...)和__rsub__(...)方法,其实二个方法差不太多,一个是正向操作,一个是反向操作:
方法名 |
方法说明 |
用法 |
__sub__(…) |
x - y |
x.__sub__(y) |
__rsub__(…) |
y - x |
x.__rsub__(y) |
示例如下:
>>> a=datetime.date(2018, 7, 16)
>>> b=datetime.date(2018, 7, 15)
>>> a.__sub__(b)
datetime.timedelta(1)
>>> a.__rsub__(b)
datetime.timedelta(-1)
计算结果的返回值类型为datetime.timedelta, 如果获得整数类型的结果则按下面的方法操作:
>>> a.__sub__(b).days
1
>>> a.__rsub__(b).days
-1
3、ISO标准化日期
如果想要让所使用的日期符合ISO标准,那么使用如下三个方法:
1).* isocalendar(...)*:返回一个包含三个值的元组,三个值依次为:year年份,week number周数,weekday星期数(周一为1…周日为7):
示例如下
>>> a = datetime.date(2018,7,15)
>>> a.isocalendar()
(2018, 28, 7)#2018年第28周的周日
>>> a.isocalendar()[0]2018
>>> a.isocalendar()[1]28
>>> a.isocalendar()[2]7
2). isoformat(...): 返回符合ISO 8601标准 (YYYY-MM-DD) 的日期字符串;
示例如下
>>> a = datetime.date(2018,7,15)
>>> a.isoformat()'2018-07-15'
3). isoweekday(...): 返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7)
示例如下:
>>> a = datetime.date(2018,7,15)
>>> a.isoweekday()7
4).与isoweekday(...)相似的还有一个weekday(...)方法,只不过是weekday(...)方法返回的周一为 0, 周日为 6
示例如下:
>>> a = datetime.date(2018,7,15)
>>> a.weekday()6
(三)、日期的字符串输出
1、如果你想将日期对象转化为字符串对象的话,可以用到__format__(...)方法以指定格式进行日期输出:
>>> a = datetime.date(2018,7,16)
>>> a.__format__('%Y-%m-%d')'2018-07-16'
>>> a.__format__('%Y/%m/%d')'2018/07/16'
>>> a.__format__('%y/%m/%d')'18/07/16'
与此方法等价的方法为strftime(...)
>>> a.strftime("%Y%m%d")'20180716'
关于格式化字符串的相关内容,请查阅本文最后的:附录:python中时间日期格式化符号
2、如果只是相简单的获得日期的字符串,则使用__str__(...)
>>> a.__str__()'2018-07-16'
三、datetime类
(一)、datetime类的数据构成
datetime类其实是可以看做是date类和time类的合体,其大部分的方法和属性都继承于这二个类,相关的操作方法请参阅,本文上面关于二个类的介绍。其数据构成也是由这二个类所有的属性所组成的。
datetime(year, month, day, hour, minute, second, microsecond(#微秒10^6秒#),tzinfo(#设置时区tzinfo = UTC(8)代表北京时间#))
(二)、专属于datetime的方法和属性
1、 date(…):返回datetime对象的日期部分:
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2018, 7, 15, 16, 9, 33, 494248)
>>> a.date()
datetime.date(2018, 7, 15)
2、time(…):返回datetime对象的时间部分:
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2018, 7, 15, 16, 9, 33, 494248)
>>> a.time()
datetime.time(16, 9, 33, 494248)#时 分 秒 微秒
3、utctimetuple(…):返回时间元组:
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2018, 7, 16, 16, 9, 33, 494248)
>>> a.utctimetuple()
time.struct_time(tm_year=2018, tm_mon=7, tm_mday=16, tm_hour=16, tm_min=9, tm_sec=33, tm_wday=2, tm_yday=81, tm_isdst=0)
4、now(…):返回当前日期时间的datetime对象:
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2018, 3, 16, 16, 9, 33, )
5、utcnow(…):返回当前日期时间的UTC datetime对象:#格林威治时间
>>> a = datetime.datetime.utcnow()
>>> a
datetime.datetime(2018, 7, 15, 8, 26, 54, 935242)
附录:python中时间日期格式化符号:
符号 |
说明 |
%y |
两位数的年份表示(00-99) |
%Y |
四位数的年份表示(000-9999) |
%m |
月份(01-12) |
%d |
月内中的一天(0-31) |
%H |
24小时制小时数(0-23) |
%I |
12小时制小时数(01-12) |
%M |
分钟数(00=59) |
%S |
秒(00-59) |
%a |
本地简化星期名称 |
%A |
本地完整星期名称 |
%b |
本地简化的月份名称 |
%B |
本地完整的月份名称 |
%c |
本地相应的日期表示和时间表示 |
%j |
年内的一天(001-366) |
%p |
本地A.M.或P.M.的等价符 |
%U |
一年中的星期数(00-53)星期天为星期的开始 |
%w |
星期(0-6),星期天为星期的开始 |
%W |
一年中的星期数(00-53)星期一为星期的开始 |
%x |
本地相应的日期表示 |
%X |
本地相应的时间表示 |
%Z |
当前时区的名称 |
%% |
%号本身 |
验证代码
import time
time1 = time.time()
a = time.localtime(time1)
s = time.strftime('''a: %a |A: %A |b: %b |B: %B |c: %c |d: %d
H: %H |I: %I |j: %j |m: %m |M: %M |p: %p
S: %S |U: %U |w: %w |W: %W |x: %x |X: %X
y: %y |Y: %Y |z: %z |%% ''',a)
print(s)