美文网首页Python
大师兄的Python学习笔记(十一): 时间模块time,dat

大师兄的Python学习笔记(十一): 时间模块time,dat

作者: superkmi | 来源:发表于2020-02-08 20:58 被阅读0次

    大师兄的Python学习笔记(十): 多进程和多线程
    大师兄的Python学习笔记(十二): 常用高级函数

    一、基础概念

    1. 关于Python中的时间模块
    • Python中有很多时间相关的模块,其中比较常用的包括time包、datetime包、 calendar包、pytz包、dateutil包等。
    • 本篇只介绍基础包,还有很多好用的模块可以根据功能需求在github中搜索。
    2. 时间戳(timestamp)
    • 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。
    • 时间戳具有唯一性,可以唯一地标识某一刻的时间。
    • 32位系统中,时间戳的长度为32位,UNIX和Windows只支持到2038年。
    >>>import time
    >>>time.time() # 获取当前时间戳,距离1971年1月1日(00:00:00 GMT)的秒数
    1579695503.7354536
    
    3. struct_time元组
    • 用于处理时间的元组,包含了时间的基本信息。
    • 可以通过索引和属性名访问值。
    • 值包括:
    索引 含义 属性
    0 tm_year (例如,1993)
    1 tm_mon range [1, 12]
    2 tm_mday range [1, 31]
    3 小时 tm_hour range [0, 23]
    4 tm_min range [0, 59]
    5 tm_sec range [0, 61]
    6 一周的第几日 tm_wday range [0, 6] ,周一为 0
    7 一年的第几日 tm_yday range [1, 366]
    8 是否夏令时 tm_isdst 0, 1 或 -1
    N/A 时区 tm_zone 时区名称的缩写
    N/A 偏离 tm_gmtoff 以秒为单位的UTC以东偏离

    二、time包

    • 提供了时间的访问和转换功能。
    • 属于Python的标准库。

    1)time.time()

    • 获取当前时间的时间戳浮点数。
    >>>import time
    >>>time.time()
    1579695503.7354536
    

    2)time.localtime(time)

    • 转换为本地时间。
    • time的默认值是当前时间。
    >>>import time
    >>>time.localtime()
    time.struct_time(tm_year=2020, tm_mon=2, tm_mday=4, tm_hour=17, tm_min=55, tm_sec=22, tm_wday=1, tm_yday=35, tm_isdst=0)
    

    3)time.asctime(time)

    • 获取默认格式的格式化时间。
    • time的默认值是当前时间。
    >>>import time
    >>>time.asctime(time.localtime())
    'Tue Feb  4 17:59:38 2020'
    

    4)time.strftime(format,time)

    • 获取格式化的时间。
    • 格式化符号:
    符号 含义
    %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
    >>>time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
    '2020-02-05 18:59:00'
    >>>time.strftime("%a %b %d %H:%M:%S %Y",time.localtime())
    'Wed Feb 05 19:01:13 2020'
    

    5)time.perf_counter()

    • 返回当前的CPU时间戳。
    • 通常用来计算程序耗时。
    >>>import time
    >>>t0 = time.perf_counter()
    >>>for i in range(10000):
    >>>    i+= 1
    >>>t1 = time.perf_counter()
    >>>tz = str(t1-t0)
    >>>print("耗时{t}毫秒".format(t=tz))
    耗时0.0007448000001204491毫秒
    

    6)time.ctime(time)

    • 返回当地的时间,相当于asctime(localtime(secs))。
    • time的默认值是当前时间。
    >>>import time
    >>>time.ctime()
    'Thu Feb  6 18:12:01 2020'
    

    7)time.gmtime(time)

    • 将时间戳转换为格林威治时间,并返回 struct_time元祖。
    • time的默认值是当前时间。
    >>>import time
    >>>time.gmtime(324234324)
    time.struct_time(tm_year=1980, tm_mon=4, tm_mday=10, tm_hour=17, tm_min=5, tm_sec=24, tm_wday=3, tm_yday=101, tm_isdst=0)
    

    8)time.localtime(time)

    • 将时间戳转换为当地时间,并返回 struct_time元祖。
    • time的默认值是当前时间。
    >>>import time
    >>>time.localtime(324234324)
    time.struct_time(tm_year=1980, tm_mon=4, tm_mday=11, tm_hour=1, tm_min=5, tm_sec=24, tm_wday=4, tm_yday=102, tm_isdst=0)
    

    9)time.mktime(tupletime)

    • 将struct_time元祖转换为时间戳。
    >>>import time
    >>>time.mktime(time.localtime())
    1580984332.0
    

    10)time.sleep(<time>)

    • 让线程等候<time>秒。
    >>>import time
    >>>print(time.localtime()[-4])
    >>>time.sleep(5)
    >>>print(time.localtime()[-4])
    30
    35
    

    11)time.strptime(str,fmt)

    • 将字符串str解析为struct_time元祖。
    • fmt为字符串的时间格式。
    >>>import time
    >>>time.strptime("2020-2-6 16:00:00","%Y-%m-%d %H:%M:%S")
    time.struct_time(tm_year=2020, tm_mon=2, tm_mday=6, tm_hour=16, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=37, tm_isdst=-1)
    

    12)time.timezone属性

    • 当地时区,即距离格林威治的偏移秒数。
    >>>import time
    >>>time.timezone
    -28800
    

    13)time.tzname属性

    • 一个包含时区名称和夏令时本地区名称的元祖。
    >>>import time
    >>>time.tzname
    ('中国标准时间', '中国夏令时')
    

    三、datetime包

    • datetime包重新封装了time包,增加了更多的接口。
    • datetime包在python标准库中。
    • datetime模块包含的类和属性:
    类和属性 功能
    date 日期对象
    time 时间对象
    datetime 日期时间对象
    datetime_CAPI 日期对象的C语言接口
    timedelta 时间间隔
    tzinfo 时区信息对象
    MAXYEAR 最大年份(9999)
    MINYEAR 最小年份(1)
    3.1 date类

    1)date(year,month,day)

    • 实例化date类。
    >>>from datetime import date
    >>>day = date(2020,2,14)
    >>>print(day)
    >>>print(day.year,day.month,day.day)
    2020-02-14
    2020 2 14
    

    2)date.max

    • 最大日期
    >>>from datetime import date
    >>>date.max
    datetime.date(9999, 12, 31)
    

    3)date.min

    • 最小日期
    >>>from datetime import date
    >>>date.min
    datetime.date(1, 1, 1)
    

    4)date.resolution

    • date类最小的对象,天。
    >>>from datetime import date
    >>>date.resolution
    datetime.timedelta(days=1)
    

    5)date.today()

    • 返回当前日期对象。
    >>>from datetime import date
    >>>today = date.today()
    >>>print(today)
    2020-02-07
    

    6)date.fromtimestamp(timestamp)

    • 根据时间戳timestamp返回date对象。
    >>>from datetime import date
    >>>import time
    >>>day = date.fromtimestamp(time.time())
    >>>print(day)
    2020-02-07
    

    7)date.replace(year,month,day)

    • 替换原属性并生成新的对象。
    • 不影响原对象。
    >>>from datetime import date
    >>>day1 = date(2020,2,14)
    >>>day2 = day1.replace(2020,3,14)
    >>>print(day2)
    >>>print(day2.year,day2.month,day2.day)
    2020-03-14
    2020 3 14
    

    8)date.timetuple()

    • 返回date对应的time.struct_time对象。
    >>>from datetime import date
    >>>today = date.today()
    >>>print(today.timetuple())
    time.struct_time(tm_year=2020, tm_mon=2, tm_mday=7, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=38, tm_isdst=-1)
    

    9)date.weekday()

    • 返回date是星期几(从0开始)。
    >>>from datetime import date
    >>>today = date.today()
    >>>print(today.weekday())
    4
    

    10)date.isoweekday()

    • 返回date是星期几(从1开始)。
    >>>from datetime import date
    >>>today = date.today()
    >>>print(today.isoweekday())
    5
    

    11)date.isocalendar()

    • 返回年、一年中的第几周和一周中的第几天的元祖。
    >>>from datetime import date
    >>>today = date.today()
    >>>print(today.isocalendar())
    (2020, 6, 5)
    

    12)date.isoformat()

    • 返回日期的标准格式字符串。
    >>>from datetime import date
    >>>today = date.today()
    >>>print(today.isoformat())
    2020-02-07
    
    3.2 time类

    1)time(hour,minute,second,microsecond,tzinfo)

    • 实例化time类。
    >>>from datetime import time
    >>>t = time(8,20,30,200)
    >>>print(t)
    >>>print(t.hour,t.minute,t.second,t.microsecond,t.tzinfo)
    08:20:30.000200
    8 20 30 200 None
    

    2)time.max

    • 最大时间。
    >>>from datetime import time
    >>>time.max
    datetime.time(23, 59, 59, 999999)
    

    3)time.min

    • 最小时间。
    >>>from datetime import time
    >>>time.min
    datetime.time(0,0)
    

    4)time.resolution

    • 最小的时间单位。
    >>>from datetime import time
    >>>time.resolution
    datetime.timedelta(microseconds=1)
    

    5)time.replace(hour, minute, second, microsecond, tzinfo)

    • 创建一个新的time对象,并用新的属性替换。
    • 不影响原对象。
    >>>from datetime import time
    >>>t1 = time(8,20,30,200)
    >>>t2 = t1.replace(10,10,20,100)
    >>>print(t2)
    10:10:20.000100
    

    6)time.isoformat()

    • 返回标准的时间字符串。
    >>>from datetime import time
    >>>t = time(8,20,30,200)
    >>>t.isoformat()
    '08:20:30.000200'
    

    7)time.strftime(time,fmt)

    • 接受一个datetime.time对象和格式,返回字符串。
    • fmt与2.4的内容相同。
    >>>from datetime import time
    >>>t = time(8,20,30,200)
    >>>print(time.strftime(t,"%Y-%m-%d %H:%M:%S"))
    >>>print(time.strftime(t,"%a %b %d %H:%M:%S %Y"))
    1900-01-01 08:20:30
    Mon Jan 01 08:20:30 1900
    
    3.3 datetime类
    • datetime类是date类和time类的结合体。

    1)datetime(year,month,day,hour,minute,second,microsecond,tzinfo)

    • 实例化datetime类。
    >>>from datetime import datetime
    >>>dt = datetime(2020,2,14,8,20,30,200)
    >>>print(dt)
    >>>print(dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo)
    2020-02-14 08:20:30.000200
    2020 2 14 8 20 30 200 None
    

    2)datetime.today()

    • 返回当前本地时间datetime对象。
    >>>from datetime import datetime
    >>>datetime.today()
    datetime.datetime(2020, 2, 8, 17, 21, 44, 571213)
    

    3)datetime.now(tz)

    • 可以接受时区参数,如果参数不存在则与today()相同。
    >>>from datetime import datetime,timezone,timedelta
    >>>tz_utc_8 = timezone(timedelta(hours=8)) # 设置与UTC的8小时时差
    >>>print(datetime.now(tz=tz_utc_8))
    2020-02-08 17:28:41.004420+08:00
    

    4)datetime.utcnow()

    • 返回UTC时间的datetime对象。(格林威治时间)
    >>>from datetime import datetime
    >>>print(datetime.utcnow())
    2020-02-08 09:30:59.423419
    

    5)datetime.fromtimestamp(timestamp, tz)

    • 根据时间戳创建datetime对象。
    • tz为时区信息。
    >>>from datetime import datetime
    >>>import time
    >>>datetime.fromtimestamp(time.time())
    datetime.datetime(2020, 2, 8, 17, 33, 9, 517400)
    

    6)datetime.isoformat(sep=’T’)

    • 返回标准格式的日期时间字符串。
    • sep是分割符。
    >>>from datetime import datetime
    >>>dt = datetime.now()
    >>>dt.isoformat()
    '2020-02-08T17:35:04.790249'
    

    7)datetime.ctime()

    • 返回一个日期时间字符串。
    >>>from datetime import datetime
    >>>dt = datetime.now()
    >>>dt.ctime()
    'Sat Feb  8 17:36:52 2020'
    

    8)datetime.strftime(fmt)

    • 将datetime对象转换为指定格式的字符串。
    >>>from datetime import datetime
    >>>dt = datetime.now()
    >>>fmt = "%Y-%m-%d %H:%M:%S"
    >>>dt.strftime(fmt)
    '2020-02-08 17:47:44'
    

    9)datetime.strptime(date_string,format)

    • 将日期时间字符串转换为datetime对象。
    >>>from datetime import datetime
    >>>fmt = "%Y-%m-%d %H:%M:%S"
    >>>datetime.strptime("2020-02-08 17:40:00",fmt)
    datetime.datetime(2020, 2, 8, 17, 40)
    

    10)datetime.combine(date,time)

    • 将date对象和time对象合并成为一个新的datetime对象。
    >>>from datetime import date,time,datetime
    >>>today = day.today()
    >>>t = time(8,20,30,200)
    >>>dt = datetime.combine(today,t)
    >>>print(dt)
    2020-02-08 08:20:30.000200
    

    11)datetime. timetuple()

    • 返回datetime对象的struct_time元组。
    >>>from datetime import datetime
    >>>dt= datetime.now()
    >>>dt. timetuple()
    time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=17, tm_min=51, tm_sec=58, tm_wday=5, tm_yday=39, tm_isdst=-1)
    

    12)datetime. utctimetuple()

    • 返回datetime对象的utc时间struct_time元组。
    >>>from datetime import datetime,timezone,timedelta
    >>>tz_utc_8 = timezone(timedelta(hours=8))
    >>>dt = datetime.now(tz=tz_utc_8)
    >>>dt. utctimetuple ()
    time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=9, tm_min=58, tm_sec=7, tm_wday=5, tm_yday=39, tm_isdst=0)
    

    13)datetime.toordinal()

    • 计算datetime是从0001-01-01开始算起的第几天。
    >>>from datetime import datetime
    >>>dt = datetime.now()
    >>>dt.toordinal()
    737463
    

    14)datetime.weekday()

    • 返回datetime对象是星期几。
    • 从0开始。
    >>>from datetime import datetime
    >>>dt = datetime.now()
    >>>dt.weekday()
    5
    

    15)datetime.isocalendar()

    • 返回datetime对象的年份,一年的第几周和一周的第几天。
    • 返回的是一个元组。
    >>>from datetime import datetime
    >>>dt = datetime.now()
    >>>dt.isocalendar()
    (2020, 6, 6)
    
    3.4 timedelta类
    • 表示两个时间的差值。

    1)timedelta(days,seconds,microseconds,milliseconds,minutes,hours,weeks)

    • 实例化timedelta类。
    >>>from datetime import timedelta
    >>>delta = timedelta(days=1,minutes=5) # 时间差为1天零5分钟
    >>>print(delta)
    1 day, 0:05:00
    

    2)timedelta.min

    • 返回负数最大时间差。
    >>>from datetime import timedelta
    >>>timedelta.min
    datetime.timedelta(days=-999999999)
    

    3)timedelta.max

    • 返回正数最大时间差。
    >>>from datetime import timedelta
    >>>timedelta.max
    datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)
    

    4)timedelta.resolution

    • 返回两个时间的最小时间差。
    >>>from datetime import timedelta
    >>>timedelta.resolution
    datetime.timedelta(microseconds=1)
    

    5)利用timedelta计算时间

    • 可以很方便的利用timedelta对datetime对象进行计算。
    >>>from datetime import *
    >>>today = datetime.now()
    >>>delta = timedelta(days=20,minutes=5,hours=10)
    >>>day = today + delta # 获得delta时间后的datetime类
    >>>print(day)
    2020-02-29 04:28:21.189760
    
    3.5 tzinfo类
    • 是关于时区信息的类。
    • 是一个抽象类,不能直接被实例化。

    1)使用时区

    >>>from datetime import *
    >>>class beijing(tzinfo): # 创建北京时区
    >>>    # 北京时间
    >>>    def __init__(self,offset=8):
    >>>        self._offset = offset
    >>>    def utcoffset(self,dt):
    >>>        return timedelta(hours=self._offset)
    >>>    def tzname(self,dt):
    >>>        return "beijing"
    >>>    def dst(self,dt):
    >>>        return timedelta(hours=self._offset)
    >>>beijing_time_now = datetime.now(beijing()) # 北京时间
    >>>utc_time_now = datetime.now(beijing(-8)) # 格林威治时间
    >>>print(beijing_time_now,beijing_time_now.tzinfo.tzname(beijing),beijing_time_now.tzinfo.utcoffset(beijing))
    >>>print(utc_time_now)
    >>>print(beijing_time_now == utc_time_now)
    2020-02-08 19:11:40.114615+08:00 beijing 8:00:00
    2020-02-08 03:07:29.020073-08:00
    True
    

    四、calendar包

    • 日历相关的模块。

    1)calendar(year)

    • 返回year的年历多行字符串。
    >>>import calendar
    >>>print(calendar.calendar(2020))
                                     2020
    
         January                   February                   March
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4  5                      1  2                         1
    6  7  8  9 10 11 12       3  4  5  6  7  8  9       2  3  4  5  6  7  8
    13 14 15 16 17 18 19      10 11 12 13 14 15 16       9 10 11 12 13 14 15
    20 21 22 23 24 25 26      17 18 19 20 21 22 23      16 17 18 19 20 21 22
    27 28 29 30 31            24 25 26 27 28 29         23 24 25 26 27 28 29
                                                       30 31
    
          April                      May                       June
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4  5                   1  2  3       1  2  3  4  5  6  7
    6  7  8  9 10 11 12       4  5  6  7  8  9 10       8  9 10 11 12 13 14
    13 14 15 16 17 18 19      11 12 13 14 15 16 17      15 16 17 18 19 20 21
    20 21 22 23 24 25 26      18 19 20 21 22 23 24      22 23 24 25 26 27 28
    27 28 29 30               25 26 27 28 29 30 31      29 30
    
           July                     August                  September
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4  5                      1  2          1  2  3  4  5  6
    6  7  8  9 10 11 12       3  4  5  6  7  8  9       7  8  9 10 11 12 13
    13 14 15 16 17 18 19      10 11 12 13 14 15 16      14 15 16 17 18 19 20
    20 21 22 23 24 25 26      17 18 19 20 21 22 23      21 22 23 24 25 26 27
    27 28 29 30 31            24 25 26 27 28 29 30      28 29 30
                             31
    
         October                   November                  December
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3  4                         1          1  2  3  4  5  6
    5  6  7  8  9 10 11       2  3  4  5  6  7  8       7  8  9 10 11 12 13
    12 13 14 15 16 17 18       9 10 11 12 13 14 15      14 15 16 17 18 19 20
    19 20 21 22 23 24 25      16 17 18 19 20 21 22      21 22 23 24 25 26 27
    26 27 28 29 30 31         23 24 25 26 27 28 29      28 29 30 31
                             30
    

    2)firstweekday()

    • 返回每周的起始日期。
    • 默认为0,星期一。
    >>>import calendar
    >>>calendar.firstweekday()
    0
    

    3)isleap(year)

    • 判断year是不是闰年。
    >>>import calendar
    >>>calendar.isleap(2020)
    True
    

    4)leapdays(year1,year2)

    • 判断两年之间的闰年总数。
    >>>import calendar
    >>>calendar.leapdays(1960,2020)
    15
    

    5)month(year,month,w=2,l=1)

    • 返回year年的month月历。
    >>>import calendar
    >>>print(calendar.month(2020,3))
        March 2020
    Mo Tu We Th Fr Sa Su
                      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
    

    6)monthcalendar(year,month)

    • 返回月历的数字矩阵。
    >>>import calendar
    >>>monthcalendar(2020,3)
    [[0, 0, 0, 0, 0, 0, 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, 0]]
    

    7)monthrange(year,month)

    • 返回year年month年的第一天是星期几。
    • 返回year年month年一共有多少天。
    >>>import calendar
    >>>calendar.monthrange(2020,3)
    (6, 31)
    

    8)prcal(year,w=2,l=1,c=6)

    • 相当于print(calendar.calendar())

    9)prmonth(year,month,w=2,l=1)

    • 相当于print(calendar.calendar())

    10)setfirstweekday(weekday)

    • 设置每周的起始日期。
    >>>import calendar
    >>>calendar.setfirstweekday(5)
    >>>calendar.firstweekday()
    5
    

    11)timegm(tupletime)

    • 接受一个时间元祖,返回时间戳。
    >>>import calendar,time
    >>>calendar.timegm(time.gmtime(time.time()))
    1581165667
    

    12)calendar.weekday(year,month,day)

    • 返回特定日期是星期几。
    >>>import calendar
    >>>calendar.weekday(2020,4,24)
    4
    

    参考资料



    本文作者:大师兄(superkmi)

    相关文章

      网友评论

        本文标题:大师兄的Python学习笔记(十一): 时间模块time,dat

        本文链接:https://www.haomeiwen.com/subject/qacpzctx.html