• 功能基础篇5——Python时间魔法,GMT、UTC,timezone,time,datetime,dateutil


    时间

    相关概念

    UT

    Universal Time,UT,世界时,包含UT0UT1UT2等。

    GMT

    Greenwich Mean Time,GMT,格林尼治平时,即UT0,英国伦敦皇家格林尼治天文台(指旧址,本初子午线所在地)当地的平太阳时。前世界标准时。

    注:Greenwich曾译为格林威治,今多用格林尼治。

    UTC

    Coordinated Universal Time(英语),Temps Universel Coordonné(法语),(英法battle后)简称UTC,协调世界时,对标UT1但不等同,UTC基于国际原子时,通过不规则的加入闰秒来抵消地球自转变慢的影响,闰秒在必要的时候会被插入到UTC中,以保证协调世界时与世界时UT1相差不超过0.9秒。现世界标准时。

    DST

    Daylight Saving Time,DST,夏令时,日光节约时间,一般在天亮早的夏季人为将时间调快一小时,整体调整社会作息时间,可以使人早睡早起,减少照明量,以充分利用光照资源,从而节约照明用电。(在不实行或取消实行夏令时的地区,有的工厂或学校会调整上下班或上下学时间以达到夏令时效果)

    Time Zone

    Time Zone,时区

    理论时区

    理论时区以被15整除的经线为中心,向东西两侧延伸7.5度,即每15°划分一个时区,共24个时区,本初子午线所在时区为中时区,东十二区和西十二区为同一个时区。理论时区的时间采用其中央经线(或标准经线)的地方时,每差一个时区,区时相差一个小时,为避免东西十二区同一地方日期却相差一天的矛盾,提出国际日期线的概念,国际日期线东侧比西侧迟整整24小时。

    法定时区

    法定时区以国界线或行政区分界线划分实际时区,即法定时区。

    中国理论时区有东五区、东六区、东七区、东八区、东九区,法定时区为东八区。

    注:按国际日期线划分,基里巴斯共和国会被划分到国际日期线两边,两地计时将相差一天而造成不便。基里巴斯共和国将菲尼克斯群岛与莱恩群岛的法定时区分别订为UTC+13与UTC+14,令其与位于UTC+12时区的吉尔伯特群岛同属一天。

    datetime

    Python标准库

    # datetime模块中类继承关系
    object
        timedelta
        tzinfo
            timezone
        time
        date
            datetime
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    tzinfo

    时区抽象基类

    timezone

    时区,直接继承tzinfo

    class datetime.timezone(offset, name=None)

    import datetime
    
    print(datetime.timezone.utc)  # UTC
    print(datetime.timezone(datetime.timedelta(0)))  # UTC
    
    • 1
    • 2
    • 3
    • 4

    timedelta

    时间间隔

    class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

    import datetime
    
    print(datetime.timedelta(microseconds=-1))  # -1 day, 23:59:59.999999
    
    • 1
    • 2
    • 3

    time

    class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

    import datetime
    
    print(datetime.time(4, 23, 1, 384))  # 04:23:01.000384
    print(datetime.time.fromisoformat('04:23:01'))  # 04:23:01
    print(datetime.time.fromisoformat('T04:23:01'))  # 04:23:01
    print(datetime.time.fromisoformat('T042301'))  # 04:23:01
    print(datetime.time.fromisoformat('04:23:01.000384'))  # 04:23:01.000384
    print(datetime.time.fromisoformat('04:23:01,000'))  # 04:23:01
    print(datetime.time.fromisoformat('04:23:01+08:00'))  # 04:23:01+08:00
    print(datetime.time.fromisoformat('04:23:01Z'))  # 04:23:01+00:00
    print(datetime.time.fromisoformat('04:23:01+00:00'))  # 04:23:01+00:00
    
    # ISO 8601 https://zh.wikipedia.org/wiki/ISO_8601
    # https://docs.python.org/zh-cn/3/library/datetime.html#datetime.time.fromisoformat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    date

    class datetime.date(year, month, day)

    import datetime
    
    print(datetime.date(2023, 9, 17))  # 2023-09-17
    print(datetime.date.fromisoformat('2023-09-17'))  # 2023-09-17
    
    • 1
    • 2
    • 3
    • 4

    datetime

    datetime直接继承date

    class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)

    from datetime import datetime, date, time, timezone
    
    print(datetime.combine(date(2005, 7, 14), time(12, 30)))  # 2005-07-14 12:30:00
    print(datetime.now(timezone.utc))  # 2023-09-17 09:52:04.690051+00:00
    print(datetime.now().tzinfo)  # None
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注:一些datetime类方法会默认将naive datetime object作为本地时区时间,注意Aware Object Naive Object转换。

    时间格式化

    time、date、datetime支持strftime(format),datetime支持strptime(date_string, format)

    https://docs.python.org/zh-cn/3/library/datetime.html#strftime-and-strptime-format-codes

    time

    Python标准库,time模块中函数主要基于所在平台C语言库,同一函数在不同平台可能有不同执行结果。

    import time
    
    # 时间戳
    print(time.time())  # 1694948259.8878381
    
    # 纳秒
    print(time.time_ns())  # 1694948259887838100
    
    # 格式化时间
    print(time.strftime("%Y-%m-%d %H:%H:%S"))  # 2023-09-17 18:18:39
    
    # 结构化时间
    print(time.struct_time.tm_min)  # 
    
    print(
        time.localtime())  # time.struct_time(tm_year=2023, tm_mon=9, tm_mday=17, tm_hour=18, tm_min=57, tm_sec=39, tm_wday=6, tm_yday=260, tm_isdst=0)
    print(
        time.gmtime())  # time.struct_time(tm_year=2023, tm_mon=9, tm_mday=17, tm_hour=10, tm_min=57, tm_sec=39, tm_wday=6, tm_yday=260, tm_isdst=0)
    print(time.sleep(1))  # None 线程睡眠
    
    print(time.strptime('2000-12.31',
                        '%Y-%m.%d'))  # time.struct_time(tm_year=2000, tm_mon=12, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=366, tm_isdst=-1)
    
    print(time.asctime())  # Sun Sep 17 19:00:07 2023
    print(time.ctime())  # Sun Sep 17 19:00:07 2023
    
    • 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

    dateutil

    三方库

    https://dateutil.readthedocs.io/en/stable/

    pip install python-dateutil
    
    • 1
    from dateutil.relativedelta import relativedelta, MO
    import datetime
    
    t = datetime.datetime.now()
    print(t)                                             # 2023-09-17 19:49:52.051939  
    
    # 相对参数
    print(t - relativedelta(years=1))                    # 2022-09-17 19:49:52.051939  
    print(t - relativedelta(months=1))                   # 2023-08-17 19:49:52.051939  
    print(t - relativedelta(days=1))                     # 2023-09-16 19:49:52.051939  
    print(t - relativedelta(weeks=1))                    # 2023-09-10 19:49:52.051939  
    print(t - relativedelta(hours=1))                    # 2023-09-17 18:49:52.051939  
    print(t - relativedelta(minutes=1))                  # 2023-09-17 19:48:52.051939  
    print(t - relativedelta(seconds=1))                  # 2023-09-17 19:49:51.051939  
    
    # 绝对参数
    print(t - relativedelta(year=1))                     # 0001-09-17 19:49:52.051939    
    print(t - relativedelta(month=1))                    # 2023-01-17 19:49:52.051939    
    print(t - relativedelta(day=1))                      # 2023-09-01 19:49:52.051939    
    print(t - relativedelta(hour=1))                     # 2023-09-17 01:49:52.051939    
    print(t - relativedelta(minute=1))                   # 2023-09-17 19:01:52.051939    
    print(t - relativedelta(second=1))                   # 2023-09-17 19:49:01.051939    
    print(t + relativedelta(year=1))                     # 0001-09-17 19:49:52.051939    
    print(t + relativedelta(month=1))                    # 2023-01-17 19:49:52.051939    
    print(t + relativedelta(day=1))                      # 2023-09-01 19:49:52.051939    
    print(t + relativedelta(hour=1))                     # 2023-09-17 01:49:52.051939    
    print(t + relativedelta(minute=1))                   # 2023-09-17 19:01:52.051939    
    print(t + relativedelta(second=1))                   # 2023-09-17 19:49:01.051939    
    print(t + relativedelta(weekday=MO(1)))              # 2023-09-18 19:49:52.051939    
    print(t - relativedelta(weekday=MO(1)))              # 2023-09-18 19:49:52.051939    
    print(t + relativedelta(weekday=MO(-1)))             # 2023-09-11 19:49:52.051939    
    print(t - relativedelta(weekday=MO(-1)))             # 2023-09-11 19:49:52.051939  
    # 若t为周一,则MO(1)、MO(-1)不会改变t
    
    • 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
    • 32
    • 33
  • 相关阅读:
    如何设计元宇宙展厅,元宇宙展厅的展示和交互形式有哪些?
    【图卷积神经网络】1-入门篇:为什么使用图神经网络
    【开题报告】基于SpringBoot的药店药品管理系统的设计与实现
    如何诊断公司项目流程发现问题提出方案?【项目管理面试秘籍3】
    嘉创房地产冲刺港交所:半年营收4.7亿 现金及现金等价物减少
    电脑病毒感染C卷(Java&&Python&&C++&&Node.js&&C语言)
    嵌入式开发:在嵌入式GUI项目中应该使用什么字体类型?
    java学习第209天,第四部分学习第9天,Linux学习第9天,p91-106(0911)-8h
    lodash库(防抖、节流)
    基于 Qt UDP通信局域网通信
  • 原文地址:https://blog.csdn.net/UZDW_/article/details/133050850