• Python的时间、日期和日历操作


    Python的时间、日期和日历操作

    Python 提供了内置的 time 、 datetime和 calendar模块可以用于时间、日期和日历操作。

    内置的time模块提供了各种与时间相关的函数。time --- 时间的访问和转换 — Python 3.10.6 文档

    内置的datetime 模块提供用于处理日期和时间的类。datetime --- 基本日期和时间类型 — Python 3.10.6 文档

    内置的calendar 模块提供了日历相关函数。datetime --- 基本日期和时间类型 — Python 3.10.6 文档

    上面给出的官方文档链接内容不太好理解,可以先略过,先看下文,回头当资料查看。

    处理日期和时间主要有以下场景

    获取当前的日期和时间

    格式化日期和时间

    计算两个时间的差值

    time模块用法

    import time  # 引入time模块

    time.time() #会返回 从 1970年1月1日0点(所谓的epoch时间点) 到 当前时间的 经过的秒数 ,可以简称为秒数时间,也称为时间戳

    time.localtime()  # 以struc_time元组的形式返回当前时间

    struc_time元组包含了9个元素,每个元素的含义如下

    tm_year, 表示年份,四位数

    tm_mon, 表示月份,1到12之间的一个数字

    tm_mday,表示每月的第几天,1到31之间的一个数字

    tm_hour, 表示小时,0到23之间的一个数字

    tm_min, 表示分钟数,0到59之间的一个数字

    tm_sec, 表示秒数,0到61之间第一个数字

    tm_wday,表示星期,0到6之间的一个数字,0表示星期一,依次类推

    tm_yaday,表示一年中的第几日,1到366之家的一个数字

    tm_isdst, 是否为夏令时,1表示是,0表示否,-1表示未知

    我们可以使用 time 模块的 strftime 方法来格式化日期,strftime()方法语法:

    time.strftime(format[, t])

    参数

    format -- 格式符号串。

    t -- 可选的参数t是一个struct_time对象。

    返回以可读字符串表示的当地时间。

    python中时间日期格式化符号:

    %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 当前时区的名称

    %% %号本身

    下面给出一个示例

    1. import time
    2. t = time.localtime() #以struc_time元组的形式返回当前时间
    3. print(t) #
    4. print("----")
    5. print(time.strftime("%b %d %Y %H:%M:%S", t)) #格式化日期

    运行之:

    下面计算两个时间相差多少秒的源码: 

    1. import time
    2. a ="2022-07-22 23:00:00"
    3. b ="2021-07-21 22:10:00"
    4. t1 = time.strptime(a, "%Y-%m-%d %H:%M:%S")
    5. t2 = time.strptime(b, "%Y-%m-%d %H:%M:%S")
    6. t3 = (time.mktime(t1)-time.mktime(t2))
    7. print(str(t3))

    运行之:

    开发程序时,经常需要获取两个代码位置在执行时的时间差,比如,我们想知道某个函数执行大概耗费了多少时间,就可以使用time.time()来做。

    import time

    before = time.time()

    #这里放测试程序段或调用的函数

    after = time.time()

    print(f"花费时间{after-before}")

    下面给出一个实际例子——查看递归法求阶乘耗费时间——源码如下:

    1. import time
    2. #递归法求阶乘
    3. def factorial(n):
    4. result = n
    5. for i in range(1,n):
    6. result *= i
    7. return result
    8. n=int(input("请输入一个整数:"))
    9. before = time.time()
    10. #这里放测试程序段或调用的函数
    11. print(str(n) + "!=" + str(factorial(n)))
    12. after = time.time()
    13. print(f"花费时间{after-before}")

    运行之:

    datetime模块用法

    datetime是日期和时间处理的基本模块,当然也支持获取当前日期和格式化,其更独特的功能是进行时间的运算,如计算两个日期之间差了几天。

    import datetime  # 引入datetime模块

    datetime.date.today()  # 获取当前日期

    datetime.date.today().year  # 获取年份

    下面计算两个日期的间隔源码如下:

    1. import datetime
    2. # 计算两个日期的间隔
    3. time_format = '%Y-%m-%d %H:%M:%S'
    4. d1 = datetime.datetime.strptime('2022-07-22 23:00:00', time_format)
    5. d2 = datetime.datetime.strptime('2021-07-21 22:10:00', time_format)
    6. DD = d1 - d2
    7. print(DD) #两个日期的间隔
    8. print(DD.days) #两个日期的间隔天数
    9. print(DD.seconds) #仅时间差中的间隔秒数【注】
    10. print(DD.total_seconds()) #两个日期相隔的秒数

    【注】seconds属性获得的秒只是时间差中的小时、分钟和秒部分的和,并没有包含时间差的天数(既是两个时间点不是同一天,失效)。请注意seconds 属性和total_seconds()函数的区别。

    属性           值

    days           获取相差天数,不包括前面的天数和秒后面的小数

    seconds        获取时间差中的秒数,,不包括前面的天数和秒后面的小数

    microseconds   秒小数点后面的差值

    运行之:

    calendar模块的用法

    该模块用于处理日历信息,内置了月份和星期的列表,可以当做一个常量来使用。

    import calendar  #引入日历模块

    print(calendar.calendar(2022))  #显示指定年份的日历

    print(calendar.month(2022,8))  # 显示指定年月的日历

    下面给出完整的生成指定日期的日历源码:

    1. import calendar #引入日历模块
    2. yy = int(input("输入年份: ")) # 输入指定年
    3. mm = int(input("输入月份: ")) # 输入指定月
    4. print(calendar.month(yy,mm)) # 显示日历

    运行之:

    上面我们返回的日历大是英文的。对中文语境不友好。下面给出改进,实现把calendar的日历转换成中文的。

    法一,源码如下:

    1. import calendar
    2. c = calendar.LocaleTextCalendar(locale="zh_CN")
    3. c.prmonth(2021, 4)

    运行之:

    不太整齐。

    法二、源码如下:

    1. import calendar
    2. def showmonth(year, month):
    3. res = calendar.monthrange(year, month)
    4. days = res[1] # 当前月份的天数
    5. w = res[0] # 当前月份第一天是星期几
    6. print(f" {year}{month}月的日历信息")
    7. print(" 一 二 三 四 五 六 日 ")
    8. print("---------------------------")
    9. d = 1
    10. print(" " * w, end="")
    11. while d <= days:
    12. print(' {:0>2d} '.format(d), end="")
    13. if (d + w) % 7 == 0:
    14. print("\n", end="")
    15. d += 1
    16. print("\n---------------------------")
    17. showmonth(2022,8) # 调用

    运行之:

    OK!

  • 相关阅读:
    Dart笔记:stream_channel 包用法
    [论文阅读] 颜色迁移-直方图渐进式颜色迁移
    工具推荐-使用RedisInsight工具对Redis集群CURD操作及数据可视化和性能监控
    【ML】自动编码器结合支持向量回归用于回归预测(数据+代码详细教程)
    启动springboot项目后运行时报错The driver has not received any packets from the server
    你问我答 | 解决关于入托的8个疑问
    内网配置git代理
    head first java 读书笔记 2
    【Android】App开发-动画效果篇
    两横一纵 | 寅家科技发布10年新征程战略
  • 原文地址:https://blog.csdn.net/cnds123/article/details/126518854