zoukankan      html  css  js  c++  java
  • python模块分析之time和datetime模块

    前言

    我们使用time和datetime模块的主要目的是对时间戳、时间字符串、时间元组等时间的表述对象进行相互的转化。而我们平时编码涉及两个时间:一个是上海时间,也可以说是北京时间,一个是UTC时间,即世界协调时间;北京时间比UTC时间多了八个小时。

    时间戳、时间字符串、时间元组

    • 时间戳:一般是float的形式;

    • 时间字符串:指的是一定格式描述时间的字符串。

    %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的相应符
    %S	秒(01 - 61)
    %U	一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
    %w	一个星期中的第几天(0 - 6,0是星期天)
    %W	和%U基本相同,不同的是%W以星期一为一个星期的开始。	
    %x	本地相应日期	
    %X	本地相应时间	
    %y	去掉世纪的年份(00 - 99)	
    %Y	完整的年份	
    %Z	时区的名字(如果不存在为空字符)	
    %%	‘%’字符
    
    %Y-%m-%d %H:%M:%S   # 年月日时分秒
    
    • 时间元组:共有九个元素,可以方便数学计算
    0	 tm_year(年)	 比如2011 
    1	 tm_mon(月)	 1 - 12
    2	 tm_mday(日)	 1 - 31
    3	 tm_hour(时)	 0 - 23
    4	 tm_min(分)	 0 - 59
    5	 tm_sec(秒)	 0 - 61
    6	 tm_wday(weekday)	 0 - 6(0表示周日)
    7	 tm_yday(一年中的第几天)	 1 - 366
    8	 tm_isdst(是否是夏令时)	 默认为-1
    

    time模块

    time模块主要有以下的函数:

    time():以秒为单位以float形式返回自从1970年1月1日开始计算的当前时间
    clock():返回进程作为浮点数开始时的CPU时间
    sleep():以浮点数形式延迟数秒,同步阻塞;
    gmtime():将从Epoch开始的秒转换为UTC时间元组
    localtime():将从Epoch开始的秒转换为本地时间元组
    asctime():将时间元组转换为字符串
    ctime():将时间转换为秒字符串
    mktime():将本地时间元组转换为从Epoch开始的秒
    strftime():根据格式规范将时间元组转换为字符串
    strptime():根据格式规范将字符串解析为时间元组
    
    • 实例
    import time
    
    # 时间戳,秒为单位,float
    print(time.time())  # 1547106159.3509371
    
    # 在不同的系统上含义不同。
    # 在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。
    # 在WINDOWS中,第一次调用,返回的是进程运行的实际时间。
    # 而第二次之后的调用是自第一次调用以后到现在的运行时间。
    print(time.clock())
    
    # 进程休眠时间
    print(time.sleep(1))
    
    # 将一个时间戳转换为UTC时区的元组时间。secs参数未提供,则以当前时间为准。
    print(time.gmtime()) # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=10, tm_hour=7, tm_min=50, tm_sec=27, tm_wday=3, tm_yday=10, tm_isdst=0)
    print(time.gmtime(1234)) # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=20, tm_sec=34, tm_wday=3, tm_yday=1, tm_isdst=0)
    #注意tm_wday指的是周几,这里是从0开始的,0代表周一
    
    # 将一个时间戳转换为本地时区的元组时间。secs参数未提供,则以当前时间为准。
    print(time.localtime()) # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=10, tm_hour=15, tm_min=55, tm_sec=17, tm_wday=3, tm_yday=10, tm_isdst=0)
    print(time.localtime(1234)) # time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=20, tm_sec=34, tm_wday=3, tm_yday=1, tm_isdst=0)
    
    # 将一个时间元组转换成时间戳
    print(time.mktime(time.localtime())) # 547107729.0
    print(time.mktime((2019, 1,10,15,55,17,3,20,0))) # 1547106917.0
    
    # 将一个时间戳转换成时间字符串
    print(time.ctime()) # Thu Jan 10 16:15:44 2019
    print(time.ctime(time.time())) # Thu Jan 10 16:15:44 2019
    print(time.ctime(1234)) # Thu Jan  1 08:20:34 1970
    
    # 将时间元组转换成时间字符串,没有参数就会默认time.localtime()
    print(time.asctime(time.localtime())) # Thu Jan 10 16:13:13 2019
    print(time.asctime((2019, 1,10,15,55,17,3,20,0))) # Thu Jan 10 15:55:17 2019
    
    # 将时间元组转化成某种格式的时间字符串
    print(time.strftime("%Y-%m-%d %H:%M:%S")) # 2019-01-10 16:20:06
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 2019-01-10 16:20:06
    
    # 将某种格式的时间字符串转化成时间元组
    print(time.strptime("2019-01-10 16:20:06", "%Y-%m-%d %H:%M:%S")) # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=10, tm_hour=16, tm_min=20, tm_sec=6, tm_wday=3, tm_yday=10, tm_isdst=-1)
    
    # 将一个时间字符串转换成时间戳
    print(time.mktime(time.strptime("2019-01-10 16:20:06", "%Y-%m-%d %H:%M:%S")))
    

    datatime模块

    datatime模块顾名思义针对的是日期,主要有5个类:

    • datetime.date:日期对象

    • datetime.datetime:日期时间对象

    • datetime.time:时间对象

    • datetime.timedelta:时间间隔对象

    • datetime.tzinfo:时区信息对象,这个对象很少使用

    date对象

    date对象主要有year,month,day三个属性,其支持加减,各种比较运算符。

    import datetime
    
    date = datetime.date(2019,1,3)
    print(date.year)
    print(date.month)
    print(date.day)
    
    # 将时间戳转化成日期对象
    d = datetime.date.fromtimestamp(123456)
    # 输出今日的日期对象
    d = datetime.date.today()
    # 将日期对象转换为时间元组
    print(d.timetuple()) # time.struct_time(tm_year=2019, tm_mon=1, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=11, tm_isdst=-1)
    # 将一个日期对象替换,返回新的日期对象
    print(d.replace(2019,5,2))  # 2019-05-02
    
    # 日期转时间字符串
    print(d.ctime()) # Fri Jan 11 00:00:00 2019
    # 日期转指定格式日期字符串
    print(d.strftime("%Y %m %d"))  # 2019 01 11
    
    # 将日期标准化
    dx = datetime.date(2019,5,2)
    print(dx.isoformat()) # 标准化日期格式 2019-05-02
    print(dx.isocalendar()) # 返回年数、周数、星期几 (2019, 18, 4)
    print(dx.isoweekday()) # 返回星期几,周一为1,   4
    print(dx.weekday()) # 返回星期几,周一为0       3
    
    # 支持加减和比较运算符
    d1 = datetime.date(2019,1,3)
    d2 = datetime.date(2018,10,21)
    print(d1-d2) # 相差的天数
    print(d1 + datetime.timedelta(days=3)) # 相加的另一个必须是时间间隔对象
    print(d1 > d2) # True
    
    # 返回公历开始到现在的天数
    x = datetime.date.today().toordinal()
    print(x) # 737070
    # 将公历开始到现在的天数转为日期对象
    d = datetime.date.fromordinal(x)
    print(d) # 2019-01-11
    

    time时间对象

    时间对象主要有小时、分钟、秒、微秒和tzinfo信息等属性。

    import datetime
    t = datetime.time(3,40,30,30)
    print(t.hour) # 小时
    print(t.minute) # 分钟
    print(t.second) # 秒
    print(t.microsecond) # 微秒
    print(t.tzinfo)
    # 表示的最大数值
    print(t.max) # 23:59:59.999999
    # 表示的最小数值
    print(t.min) # 00:00:00
    
    # 支持比较运算符
    t1 = datetime.time(2,30,30,40)
    t2 = datetime.time(2,40,35,40)
    print(t1 < t2) # True
    print(t1 != t2) # True
    
    # 将时间对象转化iso格式
    print(t1.isoformat()) # 02:30:30.000040
    # 指定时间字符串格式
    print(t1.strftime('%H:%M:%S')) # 02:30:30
    
    # 替换返回一个新的时间对象
    print(t1.replace(12,42,30,1000))
    

    datetime日期时间对象

    datetime对象是date和time对象的合体,方法大多继承自date,主要属性有year, month, day, hour,minute, second, microsecond(微秒)。

    import datetime
    dt = datetime.datetime(2019,2,3,10,30,25,200)
    print(dt) # 2019-02-03 10:30:25.000200
    
    # 属性
    print(dt.year) # 2019
    print(dt.month) # 2
    print(dt.day) # 3
    print(dt.hour) # 10
    print(dt.minute) # 30
    print(dt.second) # 25
    print(dt.microsecond) # 200
    
    print(dt.time())
    print(dt.date())
    print(dt.timetuple()) # time.struct_time(tm_year=2019, tm_mon=2, tm_mday=3, tm_hour=10, tm_min=30, tm_sec=25, tm_wday=6, tm_yday=34, tm_isdst=-1)
    
    # 类方法
    # 将时间戳转化成本地日期时间对象
    print(datetime.datetime.fromtimestamp(123456))
    # 将公历日期转换成日期时间对象
    print(datetime.datetime.fromordinal(7777))
    # 将时间戳转化成UTC日期时间对象
    print(datetime.datetime.utcfromtimestamp(123456))
    # 获取当前本地的时间
    print(datetime.datetime.now())
    # 获取当前utc时间
    print(datetime.datetime.utcnow())
    # 获取当前本地的时间
    print(datetime.datetime.today())
    # 将date对象和time对象联合成datetime对象
    print(datetime.datetime.combine(datetime.date(2019,1,11), datetime.time(2))) # 2019-01-11 02:00:00
    

    timedelta时间间隔对象

    timedelta对象主要有day,hour,seconds, microseconds,milliseconds, minutes, weeks等7个属性。

    import datetime
    t = datetime.timedelta(days=1,seconds=30,microseconds=800,milliseconds=200,minutes=30,hours=21,weeks=2)
    print(t) # 15 days, 21:30:30.200800
    
    print(t.min) # -999999999 days, 0:00:00
    print(t.max) # 999999999 days, 23:59:59.999999
    # weeks+days代表的总天数
    print(t.days) # 15
    # hours+minutes+seconds代表的总秒数
    print(t.seconds)
    # milliseconds+microseconds代表的总微秒数
    print(t.microseconds)
    # 总时间转换成秒数
    print(t.total_seconds())
    
    # 支持加减乘除和比较运算符
    t1 = datetime.timedelta(days=3)
    t2 = datetime.timedelta(days=5)
    print(t1+t2) # 8 days, 0:00:00
    print(t1-t2) # -2 days, 0:00:00
    print(t1/t2) # 1.6666666666666667
    print(t1*3) # 9 days, 0:00:00
    print(t1//t2) # 0
    

    总结

    • time模块主要使用在时间戳、时间元组和时间字符串之间进行转换;

    • 时间元组struct_time是连接time模块和datatime模块的桥梁;

    参考

  • 相关阅读:
    FlashSocke 通过flash进行socket通信(as代码)
    JavaScript 中的对象深度复制(Object Deep Clone)
    map,vector 等容器内容的循环删除问题(C++)
    [转]用JavaScript在浏览器中创建下载文件
    [记]WIndow/Linux 获取本机(全部)IPv4、IPv6、MAC地址方法 (C/C++)
    [记]Debian alias 设置, 不设置貌似有点不方便习惯
    Linux 安装配置 FTP 服务 (vsftpd)
    FreeSWITCH 安装配置的 各种坑, 填坑
    ubuntu编译安装ruby1.9.3,从p551降级到p484
    redmine3.3.3 rake db:migrate 报错invalid byte sequence in US-ASCII (Argument Error) 解决方法
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/10197511.html
Copyright © 2011-2022 走看看