python对于时间处理,提供了很多内置方法,如time、datetime、calendar等。

在平时学习和工作中,我最常使用的是time和datetime模块,本文就主要介绍下这两个模块的常用方法。

  • time
  • time模块的接口是按照C标准库time.h来实现的,里面有很多程序中经常用到的方法,诸如time.sleep()、time.time()的方法,具体常用方法如下。

    接口 描述 使用场景
    sleep 程序暂停时间
    接受参数为秒
    支持浮点型
    降低程序调用频率
    固定间隔时间执行程序
    time 返回unixtime时间戳
    返回值浮点型
    精确获取时间
    不同地区时间统一
    gmtime 接受unixtime秒数
    返回struct_time
    unixtime转字符串的过渡
    mktime 接受struct_time
    返回struct_time
    字符串转unixtime的过渡
    strftime 接受格式fomat
    可选,指定struct_time
    返回自定义的字符串
    灵活的终端输出
    strptime 接受字符串
    返回struct_time

    time模块定义了时间对象——struct_time,很多方法都是围绕它进行计算或者转换,而struct_time在使用时,可指定输出自定义的格式,即fomat。

    fomat格式 代表值
    %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)
    %f 微妙(0-999999)
    %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 当前时区的名称
    %% %号本身

    输出当前unixtime时间戳,程序睡眠3秒,再次输出时间戳

    import time
    time.time()
    #输出1430176052.916163
    time.sleep(3)
    time.time()
    #输出1430176055.917925

    关于struct_time

    #获取当前时间
    time.gmtime()
    #输出struct_time,time.struct_time(tm_year=2015, tm_mon=4, tm_mday=27, tm_hour=23, tm_min=10, tm_sec=2, tm_wday=0, tm_yday=117, tm_isdst=0)
    #获取昨天时间
    time.gmtime(time.time() - 24 * 60 * 60)
    #输出struct_time,time.struct_time(tm_year=2015, tm_mon=4, tm_mday=26, tm_hour=23, tm_min=10, tm_sec=21, tm_wday=6, tm_yday=116, tm_isdst=0)
    #将struct_time转换成unixtime
    #mktime返回的值小数点不再保留,无法精确到毫秒
    time.mktime(time.gmtime())
    #输出unxitime时间戳,1430147664.0

    输出时间为字符串

    time.strftime('%Y-%m-%d %H:%M:%S')
    #'2015-04-28 07:16:07'
    time.strftime('%c')
    #'Tue Apr 28 07:16:32 2015'
    time.strftime('%p %I')
    #'AM 07'
    #strftime第二个参数接受一个struct_time,可选,默认为当前时间
    time.strftime('%B is %m', time.gmtime(time.time() - 24 * 60 * 60))
    #'April is 04'

    将字符串转换为struct_time

    #字符串格式可自定义
    time.strptime('2009 years 06-23 time is 15:30:53', '%Y years %m-%d time is %H:%M:%S')
    #time.struct_time(tm_year=2009, tm_mon=6, tm_mday=23, tm_hour=15, tm_min=30, tm_sec=53, tm_wday=1, tm_yday=174, tm_isdst=-1)
  • datetime
  • 相比time模块,datetime提供了更为直观的接口。

    time模块定义了时间对象——struct_time,类似datetime中也提供了类似标准,所有操作可根据该对象进行计算和转换。由于datetime接口的灵活性,我们甚至可以拿两个datetime进行减法计算,得到两个时间相隔多少天。这里不再废话,先看一下datetime支持的重要类型吧!

    描述 常用属性
    date 表示日期 year
    month
    day
    time 表示时间 hour
    minute
    second
    microsecond
    datetime 表示日期时间 包含date和time属性
    timedelta 表示时间间隔 days
    seconds
    microseconds

    每一个类都提供了很多方法,且这些类拥有通用的方法,知识存储的时间结构可能不一样而已,这里举个例子。

    from datetime import *
    #输出今天
    date.today()
    #datetime.date(2015, 4, 28)
    #依旧输出今天
    datetime.today()
    #datetime.datetime(2015, 4, 28, 16, 56, 46, 540183)
    #指定某一天
    date(year = 2020, month = 4, day = 1)
    #datetime.date(2020, 4, 1)
    #指定某一天,并指定某个分钟,可以看出小时自动设置成0
    datetime(year = 2020, month = 4, day = 1, minute = 9)
    #datetime.datetime(2020, 4, 1, 0, 0, 9)

    由于datetime提供了timedelta类,具体timedelta使用如下。

    from datetime import *
    #timedelta支持三个参数days,seconds,microseconds
    #对应的,存储也按照该顺序表示
    timedelta(seconds=20)
    #datetime.timedelta(0, 20)
    #参数若为浮点数,则会计算转换成相应的参数
    #day转换为second
    timedelta(days = 1.2)
    #datetime.timedelta(1, 17280)
    #second转换为day
    timedelta(seconds = 172800)
    datetime.timedelta(2)

    通过timedelta,我们可以很灵活的获取各种时间。

    from datetime import *
    #获取五天前的时间
    datetime.now() - timedelta(days = 5)
    datetime.datetime(2015, 4, 23, 17, 24, 55, 718806)
    #获取2000年1月1日距今有多少天
    delta = date.today() - date(2000, 1, 1)
    delta.days
    #5596

    timedate的这些对象常用方法如下:

    方法名 描述
    replace(year, month, day等) 替换某个字段的值
    timetuple() 返回time模块的struct_time对象
    weekday() 返回weekday,数字表示,星期一为0
    isoformat() 返回格式如'YYYY-MM-DD’的字符串
    strftime(fomat) 自定义格式化字符串

    代码示例如下:

    from datetime import *
    #获取当前月份一号日期
    datetime.now().replace(day = 1)
    #datetime.datetime(2015, 4, 1, 17, 48, 53, 194239)
    #输出2000年1月1日的unixtime时间
    struct_time = date(2000, 1, 1).timetuple()
    time.mktime(struct_time)
    #946656000.0
    #输出字符串,当前日期
    date.today().isoformat()
    #'2015-04-28'
    datetime.today().isoformat()
    #'2015-04-28T17:52:57.285370'
    print datetime.today().strftime('%Y年%m月%d日 %H小时%M分钟%S秒 %f毫秒')
    #2015年04月28日 17小时55分钟37秒 415497毫秒
  • 类型转换
  • 我们在编写程序的时候,经常需要针对时间类型做转换,比如datetime转换为time,time转换为string等。

    对于转换,我从网络上找到了一个清晰的函数梳理图,方便以后我们coding的时候使用。