51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 509|回复: 0
打印 上一主题 下一主题

[转贴] 一个好用的 Python 日期库 -- pendulum

[复制链接]
  • TA的每日心情
    无聊
    前天 09:06
  • 签到天数: 941 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-7-25 10:08:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    关于日期处理,Python 提供了很多的库,比如标准库 datetime、第三方库 dateutil、arrow 等等。
      在使用之前需要先安装,直接 pip install pendulum 即可。
      下面来看一下用法,首先是 datetime, date, time 的创建。
    1. import pendulum
    2.   dt = pendulum.datetime(
    3.      2022, 3, 28, 20, 10, 30)
    4.   print(dt.__class__)
    5.   print(dt)
    6.   """
    7.   <class 'pendulum.datetime.DateTime'>
    8.   2022-03-28T20:10:30+00:00
    9.   """
    10.   # 创建的对象是 DateTime 类型
    11.   # 并且带有时区,默认是 UTC
    12.   # 我们可以换一个时区
    13.   dt = pendulum.datetime(
    14.      2022, 3, 28, 20, 10, 30, tz="Asia/Shanghai")
    15.   print(dt)
    16.   """
    17.   2022-03-28T20:10:30+08:00
    18.   """
    19.   # 如果不想要时区,那么指定 tz=None
    20.   dt = pendulum.datetime(
    21.      2022, 3, 28, 20, 10, 30, tz=None)
    22.   print(dt)
    23.   """
    24.   2022-03-28T20:10:30
    25.   """
    26.   # 然后是 date 的创建
    27.   d = pendulum.date(2022, 3, 28)
    28.   print(d.__class__)
    29.   print(d)
    30.   """
    31.   <class 'pendulum.date.Date'>
    32.   2022-03-28
    33.   """
    34.   # time 的创建
    35.   t = pendulum.time(20, 10, 30)
    36.   print(t.__class__)
    37.   print(t)
    38.   """
    39.   <class 'pendulum.time.Time'>
    40.   20:10:30
    41.   """
    复制代码
    如果创建 datetime 时,时区默认是 UTC。如果不想要时区,或者希望时区是本地时区,那么 pendulum 还专门提供了两个方法。

    1. import pendulum
    2.   # 创建 datetime 时设置为本地时区
    3.   # 还是调用了 pendulum.datetime 函数
    4.   # 但是 tz 被设置成了 pendulum.local_timezone()
    5.   dt = pendulum.local(
    6.      2022, 3, 28, 20, 10, 30)
    7.   print(dt)
    8.   """
    9.   2022-03-28T20:10:30+08:00
    10.   """
    11.   print(pendulum.local_timezone())
    12.   """
    13.   Timezone('Asia/Shanghai')
    14.   """
    15.   # 创建 datetime 时不设置时区
    16.   # 内部也是调用了 pendulum.datetime 函数
    17.   # 但是 tz 为 None
    18.   dt = pendulum.naive(2022, 3, 28, 20, 10, 30)
    19.   print(dt)
    20.   """
    21.   2022-03-28T20:10:30
    22.   """
    复制代码
    然后 pendulum 还提供了几个方法,比如创建当前的 datetime,date 等等。

    1. import pendulum
    2.   # 创建当前的 datetime
    3.   # 默认是本地时区,但时区可以指定
    4.   dt = pendulum.now()
    5.   print(dt)
    6.   """
    7.   2022-05-29T20:40:49.632182+08:00
    8.   """
    9.   # 创建当前的 date,但返回的仍是 datetime
    10.   # 只不过时分秒均为 0,同样可以指定时区
    11.   dt = pendulum.today()
    12.   print(dt)
    13.   """
    14.   2022-05-29T00:00:00+08:00
    15.   """
    16.   # 获取明天对应的 date
    17.   # 返回的是 datetime,时分秒为 0
    18.   # 时区可以指定,默认是本地时区
    19.   dt = pendulum.tomorrow()
    20.   print(dt)
    21.   """
    22.   2022-05-30T00:00:00+08:00
    23.   """
    24.   # 获取昨天对应的 date
    25.   dt = pendulum.yesterday()
    26.   print(dt)
    27.   """
    28.   2022-05-28T00:00:00+08:00
    29.   """
    复制代码
    我们还可以根据时间戳或者字符串来创建:

    1.  import pendulum
    2.   # 根据时间戳创建
    3.   dt1 = pendulum.from_timestamp(1653828466)
    4.   dt2 = pendulum.from_timestamp(1653828466,
    5.                                tz=pendulum.local_timezone())
    6.   print(dt1)
    7.   print(dt2)
    8.   """
    9.   2022-05-29T12:47:46+00:00
    10.   2022-05-29T20:47:46+08:00
    11.   """
    12.   # 根据字符串创建
    13.   dt1 = pendulum.parse("2020-05-03 12:11:33")
    14.   dt2 = pendulum.parse("2020-05-03 12:11:33",
    15.                       tz=pendulum.local_timezone())
    16.   print(dt1)
    17.   print(dt2)
    18.   """
    19.   2020-05-03T12:11:33+00:00
    20.   2020-05-03T12:11:33+08:00
    21.   """
    复制代码
    datetime、date、time 的创建我们说完了,然后再来看看它们支持的操作,这也是最核心的部分。
      datetime 相关操作
      操作非常多,我们逐一介绍。
    1. import pendulum
    2.   dt = pendulum.local(
    3.      2022, 3, 28, 20, 10, 30)
    4.   # 获取 date 部分和 time 部分
    5.   print(dt.date())
    6.   print(dt.time())
    7.   """
    8.   2022-03-28
    9.   20:10:30
    10.   """
    11.   # 替换掉 dt 的某部分,返回新的 datetime
    12.   # 年月日时分秒、以及时区都可以替换
    13.   print(dt.replace(year=9999))
    14.   """
    15.   9999-03-28T20:10:30+08:00
    16.   """
    17.   # 转成时间戳
    18.   print(dt.timestamp())
    19.   """
    20.   1648469430.0
    21.   """
    22.   # 返回年、月、日、时、分、秒、时区
    23.   print(dt.year, dt.month, dt.day)
    24.   print(dt.hour, dt.minute, dt.second)
    25.   print(dt.tz)
    26.   """
    27.   2022 3 28
    28.   20 10 30
    29.   Timezone('Asia/Shanghai')
    30.   """
    复制代码
    然后是生成字符串,pendulum.DateTime 对象可以转成各种格式的日期字符串。
    1. import pendulum
    2.   dt = pendulum.local(
    3.      2022, 3, 28, 20, 10, 30)
    4.   # 下面四个最为常用
    5.   print("datetime:", dt.to_datetime_string())
    6.   print("date:", dt.to_date_string())
    7.   print("time:", dt.to_time_string())
    8.   print("iso8601:", dt.to_iso8601_string())
    9.   """
    10.   datetime: 2022-03-28 20:10:30
    11.   date: 2022-03-28
    12.   time: 20:10:30
    13.   iso8601: 2022-03-28T20:10:30+08:00
    14.   """
    15.   # 当然还支持很多其它格式,不过用的不多
    16.   # 随便挑几个吧
    17.   print("atom:", dt.to_atom_string())
    18.   print("rss:", dt.to_rss_string())
    19.   print("w3c:", dt.to_w3c_string())
    20.   print("cookie:", dt.to_cookie_string())
    21.   print("rfc822:", dt.to_rfc822_string())
    22.   """
    23.   atom: 2022-03-28T20:10:30+08:00
    24.   rss: Mon, 28 Mar 2022 20:10:30 +0800
    25.   w3c: 2022-03-28T20:10:30+08:00
    26.   rfc822: Mon, 28 Mar 22 20:10:30 +0800
    27.   """
    复制代码
    我们有时也需要判断当前日期是星期几、在当前这一年是第几天等等,pendulum 也已经帮我们封装好了。
    1. import pendulum
    2.   dt = pendulum.local(
    3.      2022, 3, 28, 20, 10, 30)
    4.   # 返回星期几
    5.   # 注意:星期一到星期天分别对应 1 到 7
    6.   print(dt.isoweekday())  # 1
    7.   # 返回一年当中的第几天
    8.   # 范围是 1 到 366
    9.   print(dt.day_of_year)  # 87
    10.   # 返回一个月当中的第几天
    11.   print(dt.days_in_month)  # 31
    12.   # 返回一个月当中的第几周
    13.   print(dt.week_of_month)  # 5
    14.   # 返回一年当中的第几周
    15.   print(dt.week_of_year)  # 13
    16.   # 是否是闰年
    17.   print(dt.is_leap_year())  # False
    复制代码
    最后就是日期的运算,这是 pendulum 最为强大的地方,至于为什么强大,我们演示一下就知道了。
    1. import pendulum
    2.   dt = pendulum.local(
    3.      2022, 3, 30, 20, 10, 30)
    4.   # 返回下一个月的今天
    5.   print(dt.add(months=1))
    6.   """
    7.   2022-04-30T20:10:30+08:00
    8.   """
    9.   # 返回上一个月的今天
    10.   # 但是上一个月是 2 月,并且是平年
    11.   # 所以最多 28 天
    12.   print(dt.add(months=-1))
    13.   """
    14.   2022-02-28T20:10:30+08:00
    15.   """
    16.   # 我们看到处理的非常完美
    17.   # 该方法的原型如下,年月日时分秒都是支持的,当然还有星期也支持
    18.   """
    19.   def add(
    20.      self,
    21.      years=0,
    22.      months=0,
    23.      weeks=0,
    24.      days=0,
    25.      hours=0,
    26.      minutes=0,
    27.      seconds=0,
    28.      microseconds=0,
    29.   ):
    30.   """
    复制代码
    像 Python 的内置模块 datetime 在将日期相加的时候,最多支持到天,我们无法计算下一周、下一个月、下一年的日期。而 pendulum 则可以很方便地处理,这也是我最喜欢的一点。
      当然啦,add 里面的值为正,相当于日期往后退;值为负,相当于日期往前推。
      然后是两个日期还可以做减法:
    1. import pendulum
    2.   dt1 = pendulum.local(
    3.      2021, 1, 20, 11, 22, 33)
    4.   dt2 = pendulum.local(
    5.      2022, 3, 30, 20, 10, 30)
    6.   period = dt2 - dt1
    7.   # 返回的是 Period 对象
    8.   # 相当于 datetime 模块里面的 timedelta
    9.   print(period.__class__)
    10.   """
    11.   <class 'pendulum.period.Period'>
    12.   """
    13.   # 但是功能方面,Period 要强大很多
    14.   # 两者差了多少年
    15.   print(period.in_years())  # 1
    16.   # 两者差了多少个月
    17.   print(period.in_months())  # 14
    18.   # 两者差了多少个星期
    19.   print(period.in_weeks())  # 62
    20.   # 两者差了多少天
    21.   print(period.in_days())  # 434
    22.   # 两者差了多少个小时
    23.   print(period.in_hours())  # 10424
    24.   # 两者差了多少分钟
    25.   print(period.in_minutes())  # 625487
    26.   # 两者差了多少秒
    27.   print(period.in_seconds())  # 37529277
    复制代码
    功能非常强大,Python 的 datetime 模块里面的 timedelta 最多只能计算两个日期差了多少天,而这里年月日时分秒均可。
      以上就是本文的内容,当然 pendulum 的功能其实不止我们上面说的那些,有兴趣的话可以参考官网,但常用的差不多就这些东西。




    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-2 00:06 , Processed in 0.064036 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表