Python开发实战及代码讲解|Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!


pendulum模块详细介绍

  • 1、引言
  • 2、pendulum模块介绍
    • 2.2 介绍
    • 2.2 安装
    • 2.3 实例化时区
      • 2.3.1 默认时区展示
      • 2.3.2 时区本地化
      • 2.3.3 时区切换
      • 2.3.4 时区运算
    • 2.4 时间运算
      • 2.4.1 比较
      • 2.4.2计算差异
      • 2.4.3 加减
    • 2.5 时间调整
    • 2.6 时间与字符转换
      • 2.6.1 时间转换字符
      • 2.6.2 字符转换时间
    • 2.7 人文关怀

1、引言 小屌丝:有没有什么好的方式,让我的时间转换不那么费劲!
小鱼:开门见山的说,Python自带的datetime 模块和 time模块,不够你用?
小屌丝:转换的太费劲了。
小鱼:知道费劲,说明你的撸码有进步,不过,你这么一说,我确实想起来一个时间神器,一行代码就搞定。
小屌丝:这是真的吗?
Python开发实战及代码讲解|Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!
文章图片

小鱼:你可以不信,但是不能阻挡我的表演! !
Python开发实战及代码讲解|Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!
文章图片

话不多说,小鱼要开始表演了!!
今天来说的这个神器,就是pendulum,
对的,没看错,就是一个万能时间输出转换神器!
2、pendulum模块介绍 2.2 介绍 Pendulum 是一个 Python 包,用于简化日期时间操作;
它提供的类是原生类的替代品(它们继承自它们)。
我们先简单看个例子,如:我们要获取 多伦多和温哥华的时间差。
代码实例
#-*- coding: utf-8 -*- # @Time: 2021-10-08 # @Author : Carl_DJimport pendulum#Toronto的时间 dt_Toronto = pendulum.datetime(2021,10,8,tz = 'America/Toronto')#Vancouver的时间 dt_Vancouver = pendulum.datetime(2021,10,8,tz = 'America/Vancouver')#输出Toronto 和Vancouver相差的时长 print(dt_Toronto.diff(dt_Vancouver).in_hours())

输出结果 :
3

也就是说, 多伦多和温哥华 有3个小时的时差!
小屌丝:我去~~ pendulum 这么牛嘛???
小鱼:这是开胃菜。接着往下看!!
2.2 安装 按照规矩,我们先安装!
当然,最直接的方式,就是pip install
pip install pendulum

安装完成就是这样的,截图如下:
Python开发实战及代码讲解|Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!
文章图片

当然,
如果不想每次都pip安装,直接看这两篇:
《Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!》
《Python3,我低调的只用一行代码,就导入Python所有库!》
2.3 实例化时区 2.3.1 默认时区展示
代码实例:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulum#不指定任何时区 dt_dt = pendulum.datetime(2021,10,9) #输出默认时区 print(dt_dt.timezone.name)

运行结果:
UTC

如果不指定任何时区,那么输出的就是默认时区 即:UTC
2.3.2 时区本地化
使用local()自动将时区设置为本地时区。
类似于datetime()
但是,不同点:
local()会自动将时区转换本地时区;
类似于datetime() 并不会自动将时区转换为本地时区;
代码实例:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulum #使用local()讲时区设置为本地时区 dt_loc = pendulum.local(2021,10,8) print(dt.timezone.name)

运行结果:
Asia/Shanghai

指定时区,输出的时区结果是:Asia/Shanghai
敲黑板,知识点:
  • 通过 timezone.name 属性,可查看时间对象的具体时区;
  • 也可以直接用 timezone_name 直接获取;
  • 属性 timezone 可以简写成 tz;
  • Pendulum 时区只支持用 时区名称 设置时区。
2.3.3 时区切换
切换时区很方便,只要调用时间对象的 in_timezone 传入参数 时区名称 就可以了:
缩写形式 in_tz 也可以被识别
代码实例:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulum#默认是上海时区 dt_p = pendulum.now()#输出默认时区时间 print(dt_p)#把时区设置为温哥华,并输出 print(dt_p.in_timezone('America/Vancouver'))

输出结果:
#默认时区上海的时间 2021-10-09T10:08:17.167020+08:00#温哥华的时间 2021-10-08T19:08:17.167020-07:00

2.3.4 时区运算
不同的时区,可以进行比较,运算等,我们来看下:
代码实例
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulumdt_Toronto = pendulum.datetime(2021, 10, 8, 22, 33, 22, 0, tz='America/Toronto') dt_Vancouver = pendulum.datetime(2021, 10, 8, 19, 33, 22, 0, tz='America/Vancouver')print(f'打印多伦多时间:{ dt_Toronto.to_datetime_string()}') print(f'打印多伦多时区:{ dt_Toronto.timezone_name}') print(f'打印温哥华时间:{ dt_Vancouver.to_datetime_string()}') print(f'打印温哥华时区:{ dt_Vancouver.to_datetime_string()}')#比较两个时区的差值是否相等 ifdt_Toronto == dt_Vancouver: print(True) else: print(False)#给两个时区赋值 dt_Vancouver = dt_Vancouver.on(2021,10,1).at(0,0,0) dt_Toronto = dt_Toronto.on(2021,10,1).at(0,0,0)#使用diff()比较两个时差的差值 dif_time = dt_Vancouver.diff(dt_Toronto).in_hours() print(f'两个时区的时间差:{ dif_time}')

输出结果:
打印多伦多时间:2021-10-08 22:33:22 打印多伦多时区:America/Toronto 打印温哥华时间:2021-10-08 19:33:22 打印温哥华时区:America/Vancouver True 两个时区的时间差:3

  • 返回True,是因为设置就是相差3小时,所以,返回结果为True;
  • 使用diff(),比较两个时区的差值,返回一个时间区间(Period)对象。
敲黑板,知识点:
diff 方法用于与另一个时间对象比较,
in_hours 方法是时间区间的方法,可以将区间转化为小时,同理还有 in_days、in_years 等
2.4 时间运算 时间运算包括比较、计算差异 和 增减。
2.4.1 比较
比较很简单,对两个时间对象做比较就可以了,支持 ==、!=、>、>=、<、<=,比较的结果是 True 或 False。
代码实例:
为了显示直观,我直接用IDLE 来运行
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulumdt_Toronto = pendulum.datetime(2021, 10, 8, 22, 33, 22, 0, tz='America/Toronto') dt_Vancouver = pendulum.datetime(2021, 10, 8, 19, 33, 22, 0, tz='America/Vancouver')>>> dt_Toronto = dt_Toronto.on(2021, 10, 1).at(0, 0, 0) >>> dt_Vancouver = dt_Vancouver.on(2021, 10, 1).at(0, 0, 0)>>> first == second False >>> first != second True >>> first > second False >>> first >= second False >>> first < second True >>> first <= second True

这没有什么难度, 在前面的代码中,也有展示。
2.4.2计算差异
import pendulumdt_Vancouver = pendulum.datetime(2021, 9, 30, 0) dt_Toronto = pendulum.datetime(2021, 10, 1, 0) print(f'温哥华和多伦多时间比较:{ dt_Vancouver.diff(dt_Toronto)}') print(f'温哥华与默认时区时间比较:{ dt_Vancouver.diff()}')

输出结果:
温哥华和多伦多时间比较:[2021-09-30T00:00:00+00:00 -> 2021-10-01T00:00:00+00:00]> 温哥华与默认时区时间比较:[2021-09-30T00:00:00+00:00 -> 2021-10-09T03:48:39.418295+00:00]>

在2.3.4章节提到了,diff()比较差异的方法。
这里就不再赘述。
这里说一下,如果diff()不传参数,默认是与当前时区时间进行比较。
2.4.3 加减
加减时间,这里使用的是add()和subtract()方法。
并且每个方法都返回一个新Datetime实例。
代码实例:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulum#设置当前时间戳 dt_now = pendulum.datetime(2021, 10, 1) #打印dt_now的时间戳 print(f'打印出当前的时间戳:{ dt_now.to_datetime_string()}')#增加5年 dt_now = dt_now.add(years=5) print(f'增加5年,显示时间戳:{ dt_now.to_datetime_string()}') #减少3年, dt_now = dt_now.subtract(years=3) print(f'减少3年,显示时间戳:{ dt_now.to_datetime_string()}')#增加4个月 dt_now = dt_now.add(months=4) print(f'增加4个月,显示时间戳:{ dt_now.to_datetime_string()}')#减少2个月 dt_now = dt_now.subtract(months=2) print(f'减少2个月,显示时间戳:{ dt_now.to_datetime_string()}')#增加1周 dt_now = dt_now.add(weeks=1) print(f'增加1周,显示时间戳:{ dt_now.to_datetime_string()}')#减少3周 dt_now = dt_now.subtract(weeks=3) print(f'减少3周,显示时间戳:{ dt_now.to_datetime_string()}')#增加9小时 dt_now = dt_now.add(hours=9) print(f'增加9小时,显示时间戳:{ dt_now.to_datetime_string()}')#减少6小时 dt_now = dt_now.subtract(hours=3) print(f'减少6小时,显示时间戳:{ dt_now.to_datetime_string()}')

输出结果:
打印出当前的时间戳:2021-10-01 00:00:00 增加5年,显示时间戳:2026-10-01 00:00:00 减少3年,显示时间戳:2023-10-01 00:00:00 增加4个月,显示时间戳:2024-02-01 00:00:00 减少2个月,显示时间戳:2023-12-01 00:00:00 增加1周,显示时间戳:2023-12-08 00:00:00 减少3周,显示时间戳:2023-11-17 00:00:00 增加9小时,显示时间戳:2023-11-17 09:00:00 减少6小时,显示时间戳:2023-11-17 06:00:00

敲黑板,知识点:
  • add 和 subtract 方法参数一致,支持 years、months、weeks 等多种时间单位,而且可以一起设置
  • 时间单位参数可以支持负数,相当于 add 和 subtract 可以相互替换
  • 时间单位参数还支持小数,比如加上一天半可以写成 dt.add(days=1.5)
2.5 时间调整 可以对时间进行调整,这个貌似很厉害的样子,
我们一起来看看。
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulumdt_now = pendulum.datetime(2021, 10, 11,12,0,0) #输出当天开始时间 print(f'当天的开始时间:{ dt_now.start_of("day")}') #输出当天结束时间 print(f'当天的结束时间:{ dt_now.end_of("day")}')#输出当月开始时间 print(f'当月的开始时间:{ dt_now.start_of("month")}') #输出当天结束时间 print(f'当月的结束时间:{ dt_now.end_of("month")}')#输出21世纪开始时间 print(f'21世纪的开始时间:{ dt_now.start_of("century")}') #输出21世纪结束时间 print(f'21世纪的结束时间:{ dt_now.end_of("century")}')# dt_now.day_of_week == pendulum.SUNDAY #输出距离当前最近的下一个周三的日期 print(f'下一个周三:{ dt_now.next(pendulum.WEDNESDAY)}') #输出当前时间的本周周三的日期 print(f'本周的周三:{ dt_now.previous(pendulum.WEDNESDAY)}')dt_start = pendulum.datetime(2021, 10, 1) dt_end = pendulum.datetime(2021, 10, 31) #输出本月的中间日期 print(f'本月的中间日期:{ dt_start.average(dt_end)}')

敲黑板,知识点:
  • start_of 方法用于计算某个起始时间,可以是 天、年、月、周,甚至可以是世纪。
  • end_of ,用于计算结束;
  • next 方法用于计算以一个星期,不加参数就是计算下个星期的今天,也可以指定计算下一个哪天,比如下个星期:dt.next(pendulum.WEDNESDAY)。
  • previous ,用于计算向前的天;
  • average 方法用于计算两个时间的中间时间;
2.6 时间与字符转换 2.6.1 时间转换字符
时间对象是一个复杂的对象,对于我们来说不方便看和读,就需要将起转化为字符串,或者将字符串表示的时间转化为时间对象。
Pendulum 提供和很多方便的方式:
代码实例:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulumdt = pendulum.datetime(1985, 9, 20, 13, 14, 15)print(f'输出当前时间:{ dt}')#输出年月日 print(f'输出年月日:{ dt.to_date_string()}')#英文形式输出时间日期 print(f'英文形式输出:{ dt.to_formatted_date_string()}')#输出时间 print(f'输出当前时间戳:{ dt.to_time_string()}')#转化日期和时间 print(f'输出转化后的日期和时间:{ dt.to_datetime_string()}')print(f'输出当前格式时间:{ dt.to_day_datetime_string()}')#格式化时间 print(f'格式化时间后输出:{ dt.format("dddd Do [of] MMMM YYYY HH:mm:ss A")}')

输出结果:
输出当前时间:1985-09-20T13:14:15+00:00 输出年月日:1985-09-20 英文形式输出:Sep 20, 1985 输出当前时间戳:13:14:15 输出转化后的日期和时间:1985-09-20 13:14:15 输出当前格式时间:Fri, Sep 20, 1985 1:14 PM 格式化时间后输出:Friday 20th of September 1985 13:14:15 PM

敲黑板,知识点:
  • to_date_string 转化日期;
  • to_datetime_string 转化日期和时间;
  • to_time_string 转化时间;
  • to_formatted_date_string 转化为英文书写形式;
  • format 安装指定格式转化。
2.6.2 字符转换时间
字符串转换成时间, 使用 parse 方法就可以。
代码实例:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulumdt = pendulum.parse('1985-09-20T23:11:22')print(f'输出当前时间:{ dt}')dt = pendulum.parse('1985-09-20T23:11:22', tz='America/Toronto') print(f'输出追加tz后的时间:{ dt}') #添加strict=False,让pendulum尽可能的匹配我的想要的结果 dt = pendulum.parse('31-01-01', strict=False) print(f"输出结果为:{ dt}")dt = pendulum.parse('31/01/01', strict=False) print(f"输出结果为:{ dt}")

输出结果:
输出当前时间:1985-09-20T23:11:22+00:00 输出追加tz后的时间:1985-09-20T23:11:22-04:00 看下效果2031-01-01T00:00:00+00:00 看下效果2031-01-01T00:00:00+00:00

敲黑板,知识点:
  • 可以直接转化,也可以在转化时指定时区
  • 支持多种时间格式,如果不是标准的时间格式,需要添加参数 strict=False,这样 Pendulum 就会尽最大可能去猜
2.7 人文关怀 小屌丝:为啥这个章节叫“人文关怀”,难道要给我们发福利 ??
小鱼:想啥呢~ ~
这个章节,主要介绍pendulum最最最,最Nice的功能:人性化时间
小屌丝:咋人性化了,我没看出来呢?
小鱼:别着急,往下看!
先代码展示:
#-*- coding: utf-8 -*- # @Time: 2021-10-09 # @Author : Carl_DJimport pendulum#1天前 dt_ago = pendulum.now().subtract(days=1).diff_for_humans() print(f'输出1天前:{ dt_ago}')#1年后 dt_after = pendulum.now().diff_for_humans(pendulum.now().subtract(years=1)) print(f'输出1年后:{ dt_after}')#1个月前 dt = pendulum.datetime(2011, 8, 1) print(f'输出1个月前:{ dt.diff_for_humans(dt.add(months=1))}')#5秒后 dt_sec = pendulum.now().add(seconds=5).diff_for_humans() print(f'输出5 秒后:{ dt_sec}')#3周前 dt_wek = pendulum.now().subtract(days=24).diff_for_humans() print(f'输出3周前:{ dt_wek}')#设定输出结果显示中文 pendulum.set_locale('zh') #输出3周前,中文显示 dt_wk = pendulum.now().subtract(days=24).diff_for_humans() print(f'输出3 周前:{ dt_wk}')#5秒后 dt_seco = pendulum.now().add(seconds=5).diff_for_humans() print(f'输出5秒后:{ dt_seco}')#1天 oneday = pendulum.now().diff(pendulum.now().add(days=1)) print(f'输出1天:{ oneday.in_words()}')

输出结果:
输出1天前:1 day ago 输出1年后:1 year after 输出1个月前:1 month before 输出5 秒后:in a few seconds 输出3周前:3 weeks ago 输出3 周前:3周前 输出5秒后:5秒钟后 输出1天:1天

敲黑板,知识点:
  • diff_for_humans 可以将时间区间直接输出成人性化时间;
  • 参数 absolute 的作用是给出一个人性化的时间间隔,而不是相对于现在的说法;
  • 默认输出的是英文,如果要让说中文,通过 pendulum.set_locale(‘zh’)就可以;
  • 对于一个时间区域来说,可以用 in_words 来输出人性化时间。
注意点:
对于 dt.diff_for_humans(dt.subtract(months=1)) 这样的,相对一个日期的时间差异人性化输出,不支持中文,会报错;
所以,建议先计算两个日期的差异,再用in_words 做人性化输出。
【Python开发实战及代码讲解|Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!】Python开发实战及代码讲解|Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!
文章图片

    推荐阅读