软件测试|把datetime拍在沙滩上的pendulum模块

举报
霍格沃兹测试开发 发表于 2023/02/19 11:44:06 2023/02/19
【摘要】 前言之前我们有一篇文章,使用datetime模块来获取昨天今天明天的日期,不说非常复杂,但还是要说一下,还是有点麻烦。而且datetime模块还有一大缺点,就是对于时区的处理功能不够强大。所以,后浪来了,pendulum模块它来了,有了pendulum,我只能说一句,datetime别打电话来了,我怕pendulum误会! 安装与Python内置的datetime模块不同,pendulum...

前言

之前我们有一篇文章,使用datetime模块来获取昨天今天明天的日期,不说非常复杂,但还是要说一下,还是有点麻烦。而且datetime模块还有一大缺点,就是对于时区的处理功能不够强大。所以,后浪来了,pendulum模块它来了,有了pendulum,我只能说一句,datetime别打电话来了,我怕pendulum误会!

安装

与Python内置的datetime模块不同,pendulum是第三方库,需要我们通过pip进行安装,命令如下:

pip install pendulum

获取某地的当地时间

import pendulum

local_time_tokyo = pendulum.now('Asia/Tokyo')
local_time_shanghai = pendulum.now('Asia/Shanghai')
local_time_newyork = pendulum.now('America/New_York')
local_time_toronto = pendulum.now('America/Toronto')
local_time_vancouver = pendulum.now('America/Vancouver')
# 打印东京的当地时间
print(local_time_tokyo)
# 打印上海的当地时间
print(local_time_shanghai)
# 打印纽约的当地时间
print(local_time_newyork)
# 打印多伦多的当地时间
print(local_time_toronto)
# 打印温哥华的当地时间
print(local_time_vancouver)
-------------------------------
2023-02-10T16:02:10.756265+09:00
2023-02-10T15:02:10.764323+08:00
2023-02-10T02:02:10.764323-05:00
2023-02-10T02:02:10.764323-05:00
2023-02-09T23:02:10.774224-08:00

时区运算

不同时区的时间可以用来比较、运算和转化,例如:

import pendulum
# 计算上海与温哥华的时差
first = pendulum.datetime(2023, 2, 10, 15, 26, 11, 0, tz='Asia/Shanghai')
second = pendulum.datetime(2023, 2, 10, 15, 26, 11, 0, tz='America/Vancouver')
time_delta=first.diff(second).in_hours()
print(time_delta)
-------------------------
# 输出结果如下:
16

pendulum获取日期时间

import pendulum

# 创建当前的 datetime
# 默认是本地时区,但时区可以指定
local_time = pendulum.now()
print(local_time)

# 创建当前的 date,但返回的仍是 datetime
# 只不过时分秒均为 0,同样可以指定时区
today = pendulum.today()
print(today)

# 获取明天对应的 date
# 返回的是 datetime,时分秒为 0
# 时区可以指定,默认是本地时区
tomorrow = pendulum.tomorrow()
print(tomorrow)

# 获取昨天对应的 date
yesterday = pendulum.yesterday()
print(yesterday)
----------------------------
输出结果如下:
2023-02-15T11:31:10.771990+08:00
2023-02-15T00:00:00+08:00
2023-02-16T00:00:00+08:00
2023-02-14T00:00:00+08:00

我们可以看到,使用pendulum时,我们获取昨天和明天的日期比datetime模块更加快速直接,datetime模块需要借助timedelta,提供时间差,才能计算昨天明天的日期。

获取其他信息

有时候我们除了需要了解日期,还需要了解这一天是周几,是今年的第几天,这周是今年的第几周等信息,这些东西,pendulum也替我们封装好了方法,我们可以直接使用。

import pendulum

today = pendulum.local(
    2023, 6, 7, 11, 10, 30)

# 返回星期几
# 注意:星期一到星期天分别对应 1 到 7
print(today.isoweekday())  

# 返回一年当中的第几天
# 范围是 1 到 366
print(today.day_of_year)  

# 返回一个月当中的第几天
print(today.days_in_month)  

# 返回一个月当中的第几周
print(today.week_of_month)  

# 返回一年当中的第几周
print(today.week_of_year) 

# 是否是闰年
print(today.is_leap_year())  
------------------------------
输出结果如下:
3
158
30
2
23
False

pendulum日期运算

接下来我们介绍的是pendulum相比datetime最强大的地方,日期时间的运算功能。示例代码如下:

import pendulum

today = pendulum.local(
    2022, 3, 30, 20, 10, 30)

# 返回下一个月的今天
print(today.add(months=1))

# 返回上一个月的今天
# 但是上一个月是 2 月,并且是平年
# 所以最多 28 天
print(today.add(months=-1))
----------------------------------
输出结果如下:
2022-04-30T20:10:30+08:00
2022-02-28T20:10:30+08:00

上述代码返回的是月份的加减,但这不是全部,这只是基本操作,后面我们来展示一下更强的日期时间的运算操作。

import pendulum

time1 = pendulum.local(
    2010, 6, 17, 12, 22, 33)

time2 = pendulum.local(
    2013, 6, 7, 20, 10, 30)

period = time2 - time1
# 返回的是 Period 对象
# 相当于 datetime 模块里面的 timedelta
print(period.__class__)
"""
<class 'pendulum.period.Period'>
"""

# 但是功能方面,Period 要强大很多
# 两者差了多少年
print(period.in_years())  
# 两者差了多少个月
print(period.in_months())  
# 两者差了多少个星期
print(period.in_weeks())  
# 两者差了多少天
print(period.in_days())  
# 两者差了多少个小时
print(period.in_hours())  
# 两者差了多少分钟
print(period.in_minutes())  
# 两者差了多少秒
print(period.in_seconds())  

----------------------------
输出结果如下:
2
35
155
1086
26071
1564307
93858477

如上,我们输出了两个时间点相差了多少时间的精确信息,不只是相差多少天,年月日时分秒还有周都可以计算出来,真的是非常方便快捷。

总结

本篇文章我们主要讲解了pendulum模块的安装和使用,这个模块比datetime模块使用更加方便,对于时区和时间的计算更加快捷,大家快用起来吧!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。