• Python日期与时间模块datetime、time、Calendar、dateuil 相关使用讲解


    前言

    在开发中经常会遇到查询日期、时间、时间戳,或者日期比较等相关操作,为了方便以后使用,本文将对python操作时间的各种操作做出总结。
    作者:有勇气的牛排

    时间戳: 即以整型或浮点型表示的是一个以秒为单位的时间间隔。这个时间的基础值是从1970年的1月1号零点开始算起。

    1 datetime 模块

    此模块常用类有:date、time、datetime、timedelta

    导入

    from datetime import *
    
    • 1

    1.1 date类

    获取当前日期

    from datetime import *
    
    dt = date.today()
    print(dt)		# 输出:2022-09-07
    
    print(dt.year)          # 2022
    print(dt.month)
    print(dt.day)
    
    # 返回星期几  星期一 = 0
    print(dt.weekday())             # 输出:2
    # 返回星期几  星期一 = 1
    print(dt.isoweekday())          # 0001-01-01
    
    # 返回 ctime() 样式字符串
    print(dt.ctime())               # Wed Sep  7 00:00:00 2022
    # 修改 年、月、日
    print(dt.replace(year=2023))    # 输出:2023-09-07
    # 打印最大/最小日期
    print(dt.max)                   # 9999-12-31
    print(dt.min)                   # 0001-01-01
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    使用date类的构造函数,初始化变量

    d = date(2022, 9, 6)
    print(d)			# 输出:2022-09-06
    
    • 1
    • 2

    字符串初始化为date

    d = date.fromisoformat("2022-09-06")
    print(d)        # 2022-09-06
    print(type(d))  # 
    
    • 1
    • 2
    • 3

    时间戳 转 date对象

    d = date.fromtimestamp(1662451516)
    print(d)    	# 2022-09-06
    
    • 1
    • 2

    date 转 字符串

    d = date.today()
    str_date = d.isoformat()
    print(str_date)          # 2022-09-06 字符串
    
    • 1
    • 2
    • 3

    1.2 time类

    from datetime import time
    
    t1 = time(10, 20, 32)
    print(t1)   # 输出:10:20:32
    
    # 打印时分秒
    print(t1.hour)
    print(t1.minute)
    print(t1.second)
    
    # 将对象转为字符串
    res = time.isoformat(t1)
    # print(t1.isoformat()) # 方式2
    print(res)              # 输出:10:20:32
    print(type(res))        # 输出:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    1.3 datetime类

    from datetime import datetime
    
    # datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
    t = datetime(2022, 9, 7, 20, 32, 20)
    print(t)
    
    # 打印 年月日 时分秒
    print(t.year)
    print(t.month)
    print(t.day)
    print(t.hour)
    print(t.minute)
    print(t.second)
    
    # 获取当前时间
    today = datetime.now()
    print(today)
    
    # 字符串转为datetime
    d = datetime.fromisoformat("2022-09-10 12:25:36")
    print(type(d))	# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.4 timedelta类

    主要用于计算日期差异,或者日期相关操作

    1.4.1 时间增加
    from datetime import datetime, timedelta
    
    now = datetime.now()
    print(now)
    
    # 加2天
    # def __new__(cls, days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
    new_time = now + timedelta(days=2)
    print(new_time.strftime("%Y-%m-%d %H:%M:%S"))
    
    # 加1周
    new_time = now + timedelta(weeks=1)
    print(new_time.strftime("%Y-%m-%d %H:%M:%S"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1.4.2 计算时间差
    from datetime import datetime, date
    
    # 计算时间差
    now = datetime.now()
    # 将字符串转为
    d = datetime.fromisoformat("2022-09-10 12:25:36")
    res = d - now
    print(res)
    print(res.days)
    print(res.seconds)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    1.5 datetime格式化

    from datetime import datetime, date
    
    now = datetime.now()
    print(now)
    print(now.strftime("%Y-%m-%d %H:%M:%S"))
    print(now.strftime("%y-%m-%d %H:%M:%S %A"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    符号描述
    %y两位数的年份表示(00-99)
    %Y四位数的年份表示(0000-9999)
    %m月份(01-12)
    %d月内的天(0-31)
    %H24h值小时数(0-23)
    %I12小时小时数
    %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一年中的星期数(0-53)星期一位星期的开始
    %x本地相应的日期表示
    %X本地相应的事假表示
    %Z当前时区的名称
    %%%号本身

    2 time 标准库

    元组表示法:以Python的数据结构表示,共有9个。

    属性描述
    tm_year
    tm_mon月(1-12)
    tm_mday日(1-31)
    tm_hour时(0-23)
    tm_min分(0-59)
    tm_sec秒(0-59)
    tm_wday0-6(0表示周日)
    tm_yday1-366(一年中的第几天)
    tm_isdst默认为-1(是否为夏令时)

    2.1 时间操作

    import time
    
    # 当前timestamp
    timestamp = time.time()
    print(timestamp)
    
    # 时间戳 转 时间元组
    # 方式1:time.struct_time(tm_year=2022, tm_mon=9, tm_mday=10, tm_hour=16, tm_min=11, tm_sec=30, tm_wday=3, tm_yday=251, tm_isdst=0)
    time_tuple1 = time.localtime()
    # 方式2
    time_tuple2 = time.localtime(timestamp)
    print(time_tuple1)
    print(time_tuple2)
    
    # 时间元组 转 时间戳
    timestamp2 = time.mktime(time_tuple1)
    print(timestamp2)  # 1662624690.0
    
    # 时间元组 格式化为 时间
    strftime1 = time.strftime("%Y-%m-%d %H:%M:%S", time_tuple1)
    print(strftime1)
    # 时间 格式化为 时间元组
    time_tuple3 = time.strptime("2022-09-10 16:14:18", "%Y-%m-%d %H:%M:%S")
    print(time_tuple3)
    
    # 返回一个可读的时间字符串
    print(time.ctime())               # Thu Sep  10 16:17:40 2022
    print(time.ctime(time.time()))    # Thu Sep  10 16:17:40 2022
    
    print(time.asctime())
    print(time.asctime(time.localtime()))
    
    • 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

    2.2 程序睡眠

    程序睡眠

    # 程序暂停/睡眠3s
    time.sleep(3)
    
    • 1
    • 2

    3 Calendar 日历模块

    打印日历

    import calendar
    
    cal = calendar.month(2022,9)
    print(cal)  # str
    """
       September 2022
    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
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    闰年相关

    import calendar
    
    # 判断是否为闰年
    print(calendar.isleap(2000))  # True
    print(calendar.isleap(2022))  # False
    
    # 查看2个年份之间的闰年总和
    print(calendar.leapdays(2008, 2060))  # 13
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4 dateuil 日期模块

    安装

    pip install dateutils
    
    • 1
    from datetime import datetime, date
    from dateutil.relativedelta import relativedelta, MO, TU, WE, TH, FR, SA, SU
    
    now = datetime.now()
    today = date.today()
    print(now)
    print(today)
    
    """
        时间增加
        dt1=None, dt2=None,
        years=0, months=0, days=0, leapdays=0, weeks=0,
        hours=0, minutes=0, seconds=0, microseconds=0,
        year=None, month=None, day=None, weekday=None,
        yearday=None, nlyearday=None,
        hour=None, minute=None, second=None, microsecond=None
    """
    # 下个月
    next_month = now + relativedelta(months=1)
    print(next_month)
    
    # 一年后 前一个月
    next_year_prev_month = now + relativedelta(years=1, months=-1)
    print(next_year_prev_month)
    
    # 下周五(前提是今天为周六、周天)
    next_fr = now + relativedelta(weekday=FR)
    print(next_fr)
    
    # 计算两个日期差
    res = relativedelta(date(2060, 6, 20), today)
    print(res)          # relativedelta(years=+37, months=+9, days=+12)
    print(res.years)    # 37
    
    • 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

    5 案例讲解

    5.1 列表时间排序

    import datetime
    
    def get_timestamp(date):
        return datetime.datetime.strptime(date, "%Y-%m-%d").timestamp()
    
    time_list = ["2023-06-01", "2022-10-25", "2022-11-25", "2021-10-03"]
    time_list = sorted(time_list, key=lambda date: get_timestamp(date))
    
    print(time_list)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image.png

    5.2 将时间戳转换成时间

    import time
    
    timestamp = 1462451334
    
    #转换成localtime
    time_local = time.localtime(timestamp)
    #转换成新的时间格式(2016-05-05 20:28:54)
    dt = time.strftime("%Y-%m-%d %H:%M:%S",time_local)
    
    print(dt)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    LeetCode 2520. 统计能整除数字的位数
    货物寄到英国选择什么物流比较划算?
    [线性dp]Burenka and Traditions Codeforces1719D1&&D2
    图像滤波处理
    java Thread的状态分析
    Vue简介
    进程信号(Linux)
    JUC并发编程(一):Java内存模型(JMM)及三大特性:可见性、有序性、原子性
    【QT系列教程】之一安装配置
    Python闭包:深入理解与应用场景解析
  • 原文地址:https://blog.csdn.net/zx77588023/article/details/126726690