• 9.python内置模块之time模块


    Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。Python 提供了 time ,datatime, calendar 等模块可以用于格式化日期和时间。时间间隔是以秒为单位的浮点小数。每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。Python 的 time 模块下有很多函数可以转换常见日期格式。如函数 time.time() 用于获取当前时间戳。时间戳单位最适于做日期运算。但是1970年之前的日期就无法以此表示了。太遥远的日期也不行,UNIX和Windows只支持到2038年。

    Unix时间戳(timestamp):返回得到一个数值类型的数据(python表现浮点值),记录了时间原点(1970年00点00分00秒)至今的秒值

    UTC时间:世界协调时间

    GMT时间:格林尼治/格林威治时间

    CCT时间:北京时间(当前时间),属于东八区      【注意】比UTC时间 + 8小时

    1.time模块常用的函数:

    1). time.time():返回时间戳对象,数据类型浮点值

    2). time.localtime([ts]):将时间戳数据转换为一个本地元祖对象返回 ,数据类型:time.struct_time类型,返回time.struct_time类型的对象,内部封装维护着9个元素

    3).  time.gmtime([ts]):将时间戳数据转换为utc时间元祖对象返回    数据类型:time.struct_time类型

    4). time.mktime(tp):将本地元祖对象转换为时间戳对象(逆过程)

    5). time.ctime([ts]):将时间戳对象转换为字符串数据

    6). time.asctime([tp]):将本地元祖对象转化为字符串数据

    7). time.strftime(format,tp):将本地元祖对象以format格式化为str类型的数据返回

    8). time.strptime(string,format):将字符串数据以format格式化为本地元祖对象返回

    9). time.sleep(secs):推迟调用线程的运行,secs指秒数

    10). time.clock():用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。由于该方法依赖操作系统,在 Python 3.3 以后不被推荐,而在 3.8 版本中被移除,需使用下列两个函数替代。time.perf_counter() :返回系统运行时间;time.process_time() : 返回进程运行时间。

     代码演示示例:

     1 import time
     2 
     3 print(time.time())          # 得到1547637538.7860892 
     4  
     5 print(time.localtime())     # 得到time.struct_time(tm_year=2019,tm_mon=1,
     6 tm_mday=16,tm_hour=19,tm_min=8,tm_sec=10,tm_wday=2,tm_yday=16,tm_isdst=0)
     7  
     8 print(time.gmtime())        # 得到time.struct_time(tm_year=2019, tm_mon=1, tm_mday=16, tm_hour=11, tm_min=24, tm_sec=9, tm_wday=2, tm_yday=16, tm_isdst=0) 
     9 
    10 # mktime(tp)函数被调用执行,必须要传入一个实际参数,参数类型为time.struct_time类型对象,返回值不会保留小数点后7位,只有一个(默认为0)
    11 tp = (2019,1,5,16,35,45,5,5,0)
    12 print(time.mktime(tp))      # 得到 1546677345.0
    13 
    14 print(time.ctime())         # 得到 Wed Jan 16 19:43:35 2019 
    15 
    16 print(time.asctime())       # 得到 Sat Jan  5 16:35:45 2019
    17 
    18 tp = (2019,1,5,16,35,45,5,5,0)
    19 print(time.strftime('%Y-%m-%d %H:%M:%S',tp)           # 得到 2019-01-05 16:35:45 
    20 print(time.strftime('%Y/%m/%d %H:%M:%S',tp)           # 得到 2019/01/05 16:35:45 
    21 print(time.strftime('%y/%m/%d %H:%M:%S',tp)           # 得到 19/01/05 16:35:45
    22 print(time.strftime('%y/%h/%d %H:%M:%S',tp)           # 得到 19/Jan/05 16:35:45 
    23 print(time.strftime('%D %X',tp)                       # 得到 01/05/19 16:35:45 
    24 print(time.strftime('%Y"年"%h"月"%d"日" %H:%M:%S',tp)) # 报错 UnicodeEncodeError,因为格式内容存在中文(非法字符)
    25 
    26 str3 = 2019-01-05 16:35:45
    27 print(time.strptime(str3,'%Y-%m-%d %H:%M:%S'))        # 得到 time.struct_time(tm_year=2019, tm_mon=1, tm_mday=5, tm_hour=16, tm_min=35, tm_sec=45, tm_wday=5, tm_yday=5, tm_isdst=-1) 
    29 print(time.strptime(str3,'%Y/%m/%d %H:%M:%S'))        # 报错 ValueError,解析字符串数据时的(format)必须和字符串格式化时的format保持一致,否则报错...
    30 
    31 time.sleep(2)

    格式化日期以自定义样式显示输出:

    1 # 元祖格式化成2016-03-20 11:45:39形式
    2 print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  #2016-04-07 10:29:46
    3 
    4 # 元祖格式化成Sat Mar 28 22:24:24 2016形式
    5 print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))  #Thu Apr 07 10:29:46 2016
    6   
    7 # 格式字符串转换为时间戳
    8 a = "Sat Mar 28 22:24:24 2016"
    9 print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))  #1459175064.0


    时间元组,很多Python函数用一个元组装起来的9组数字处理时间,即struct_time元组

     1 '''
     2  序号      字段             值
     3  0        4位数年           2008
     4  1        月               1 到 12
     5  2        日               1到31
     6  3        小时             0到23
     7  4        分钟             0到59
     8  5        秒              0到61 (60或61 是闰秒)
     9  6    一周的第几日         0到6 (0是周一)
    10  7    一年的第几日         1到366 (儒略历)
    11  8       夏令时            -1, 0, 1, -1是决定是否为夏令时的旗帜   
    12 ''' 

    struct_time元组,这种结构具有如下属性

     1 '''
     2 序号    属性      值
     3 0    tm_year    2008
     4 1    tm_mon     1 到 12
     5 2    tm_mday    1 到 31
     6 3    tm_hour    0 到 23
     7 4    tm_min     0 到 59
     8 5    tm_sec     0 到 61 (60或61 是闰秒)
     9 6    tm_wday    0到6 (0是周一)
    10 7    tm_yday    一年中的第几天,1 到 366
    11 8    tm_isdst   是否为夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1
    12 '''

    python中时间日期格式化符号

     1 '''
     2 %y 两位数的年份表示(00-99)
     3 %Y 四位数的年份表示(000-9999)
     4 %m 月份(01-12)
     5 %d 月内中的一天(0-31)
     6 %H 24小时制小时数(0-23)
     7 %I 12小时制小时数(01-12)
     8 %M 分钟数(00=59)
     9 %S 秒(00-59)
    10 %a 本地简化星期名称
    11 %A 本地完整星期名称
    12 %b 本地简化的月份名称
    13 %B 本地完整的月份名称
    14 %c 本地相应的日期表示和时间表示
    15 %j 年内的一天(001-366)
    16 %p 本地A.M.或P.M.的等价符
    17 %U 一年中的星期数(00-53)星期天为星期的开始
    18 %w 星期(0-6),星期天为星期的开始
    19 %W 一年中的星期数(00-53)星期一为星期的开始
    20 %x 本地相应的日期表示
    21 %X 本地相应的时间表示
    22 %Z 当前时区的名称
    23 %% %号本身
    24 '''
    
    

    2.datetime模块常用函数:

    理解datetime模块是time模块的补充/扩展,datetime模块中有一些常用类:1).datetime类:记录了日期和时间数据;2).date类:记录了日期数据;3).time类:记录了时间数据。

    datetime类:

    1). datetime.datetime.now() :获取当前的日期时间对象(返回值是一个datetime类型的数据)

    2). datetime.datetime.today():获取当前的日期时间对象(返回值是一个datetime类型的数据)

    3). datetime.datetime.utcnow():获取当前的日期时间对象(utc时间,数据类型为datetime)

    4). datatime.datetime(year,month,day,[hour,minute,seconds,num]):获取指定的日期和时间对象(类型:datetime)(就是获取某一个自己想要的时间点)

    【假设】dt = datetime.datetime(2018,12,12,11,11,11,345678)

    5). dt.strftime(format):将datetime类型的数据转换为指定格式的字符串数据

    6). dt.date():从日期时间对象中分离出日期对象和时间对象,得到date类型对象

    7). dt.time():从日期时间对象中分离出日期对象和时间对象,得到time类型对象

    8). dt.timestamp():从日期时间对象中得到对应的时间戳对象(日期时间 -> 时间戳对象)

    9). dt.timetuple():从日期时间对象中得到对应的时间元祖(日期时间 -> 时间元祖)

    10). datetime.date.fromtimestamp(ts):将时间戳对象转换为日期对象

    11). datetime.timedelta():得到一个timedelta类型的对象,可以和datetime对象做运算(+和-)

    【补充】:

    操作属性:尝试获取日期时间对象中的年、月、日、时、分、秒、小数点后的数据;此操作不是针对函数层面,而是属性层面的操作。dt.year;dt.month;dt.day;dt.hour;dt.minute;dt.second;dt.microsecond。

     1 import datetime
    1
    dt = datetime.datetime.now() 2 print(dt,type(dt)) # 2019-01-16 19:52:44.402614 <class 'datetime.datetime'> 3 4 dt1 = datetime.datetime.today() 5 print(dt1,type(dt1)) # 2019-01-16 19:52:44.402615 <class 'datetime.datetime'> 6 7 dt2 = datetime.datetime.utcnow() 8 print(dt2,type(dt2)) # 2019-01-16 11:52:44.402614 <class 'datetime.datetime'> 9 10 11 dt3 = datetime.datetime(2018,12,12,11,11,11,345678) 12 print(dt3,type(dt3)) # 2018-12-12 11:11:11.345678 <class 'datetime.datetime'> 13 14 str1 = dt3.strftime('%Y-%m-%d %X') 15 print(str1,type(str1)) # 2018-12-12 11:11:11 <class 'str'> 16 17 # 从日期时间对象中分离出日期对象和时间对象 18 print(dt3.date(),type(dt3.date())) # 2018-12-12 <class 'datetime.date'> 19 print(dt3.time(),type(dt3.time())) # 11:11:11.345678 <class 'datetime.time'> 20 21 22 ts = dt3.timestamp() 23 print(ts,type(ts)) # 1544584271.345678 <class 'float'> 24 25 tp = dt3.timetuple() 26 print(tp,type(tp)) # time.struct_time(tm_year=2018,tm_mon=12,tm_mday=12, tm_hour=11, tm_min=11, tm_sec=11,tm_wday=2, tm_yday=346, tm_isdst=-1) <class 'time.struct_time'> 27 28 29 ts=1544584271.345678 30 d = datetime.date.fromtimestamp(ts) 31 print(d,type(d)) # 2018-12-12 <class 'datetime.date'> 32 33 34 delta = datetime.timedelta(days=1,hours=1,minutes=1,seconds=1) 35 print(delta,type(delta)) # 1day,1:01:01<class'datetime.timedelta'> 36 # 计算时间差 37 obj = dt3 - delta 38 print(obj,type(obj)) # 2018-12-11 10:10:10.345678 <class 'datetime.datetime'> 39 print(dt3 + delta) # 2018-12-13 12:12:12.345678 40 41 42 # 操作属性:尝试获取日期时间对象中的年、月、日、时、分、秒、小数点后的数据 43 print(dt3.year,dt3.month,dt3.day) # 2018 12 12 44 print(dt3.hour,dt3.minute,dt3.second,dt3.microsecond) # 11 11 11 345678 45
     

    3.calendar模块常用函数:

    1). calendar.calendar(year[,w=2,l=1,c=6]):返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。【print(calendar.calendar(year[,w=2,l=1,c=6])) == calendar.prcal(year,w=2,l=1,c=6)】

    2). calendar.month(year,month,w=2,l=1):返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l 是每星期的行数。【print(calendar.month(year,month,w=2,l=1)) == calendar.prmonth(year,month,w=2,l=1)】

    3). calendar.monthcalendar(year,month):返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。

    4). calendar.monthrange(year,month):返回两个整数。第一个是该月的星期几,第二个是该月有几天。星期几是从0(星期一)到 6(星期日)。

    5). calendar.firstweekday( ):返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。

    6). calendar.setfirstweekday(weekday):设置每周的起始日期码。0(星期一)到6(星期日)。

    7). calendar.weekday(year,month,day):返回给定日期的星期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

    8). calendar.timegm(tupletime):和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。

    9). calendar.isleap(year):判断year是否是闰年。是闰年返回 True,否则为 false。

    10). calendar.leapdays(y1,y2):返回在Y1,Y2两年之间的闰年总数。

     1 import calendar
     2 
     3 print(calendar.calendar(2018,w=2,l=1,c=6))   # 显示2018年年历
     4 
     5 print(calendar.month(2018,1,w=2,l=1,c=6)     # 显示2018年1月月历
     6 
     7 print(calendar.monthcalendar(2018,1)         # 显示2018年1月日期[[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28], [29, 30, 31, 0, 0, 0, 0]]
     8 
     9 print(calendar.monthrange(2019,1))           # (1, 31) 表示2019年一月的星期二,这个月一共有31天
    10 print(calendar.monthrange(2019,2))           # (4, 28)
    11 
    12 print(calendar.firstweekday())               # 0 表示每周的起始期为星期一
    13 print(calendar.setfirstweekdy(1)             # 1 设置每周的起始期设置为星期二
    14 print(calendar.weekday(2019,1,1)             # 1 表示2019年1月1日是星期二,0(星期一)到6(星期日)
    15 
    16 ts = calendar.timegm((2019,1,16,16,13,43))
    17 print(ts,type(ts))                           # 1547655223 <class 'int'>
    18  
    19 print(calendar.isleap(2004))                 # True
    20 print(calendar.leapdays(2000,2020))          # 5

  • 相关阅读:
    codevs2894、2837、1669、2503、3231
    poj2528
    HDU 1542 Atlantis(矩形面积并)
    Light OJ 1080
    陶哲轩实分析 2.2节 习题试解
    Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
    css3模糊图片
    高速掌握Lua 5.3 —— I/O库 (1)
    覆盖率測试工具gcov的前端工具_LCOV_简单介绍
    MySQL显示状态信息
  • 原文地址:https://www.cnblogs.com/bonheur/p/12337375.html
Copyright © 2020-2023  润新知