51Testing软件测试论坛

标题: 一个好用的 Python 日期库 -- pendulum [打印本页]

作者: lsekfe    时间: 2022-7-25 10:08
标题: 一个好用的 Python 日期库 -- pendulum
关于日期处理,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 的功能其实不止我们上面说的那些,有兴趣的话可以参考官网,但常用的差不多就这些东西。









欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2