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

简介: Python 3,一行代码处理各种时间转换,从此跟datetime,time模块说拜拜 ~ ~ 不收藏算我输!!!

1、引言


小屌丝:有没有什么好的方式,让我的时间转换不那么费劲!

小鱼:开门见山的说,Python自带的datetime 模块和 time模块,不够你用?

小屌丝:转换的太费劲了。

小鱼:知道费劲,说明你的撸码有进步,不过,你这么一说,我确实想起来一个时间神器,一行代码就搞定。

小屌丝:这是真的吗?


小鱼:你可以不信,但是不能阻挡我的表演! !


话不多说,小鱼要开始表演了!!

今天来说的这个神器,就是pendulum,

对的,没看错,就是一个万能时间输出转换神器!


2、pendulum模块介绍


2.2 介绍


Pendulum 是一个 Python 包,用于简化日期时间操作;

它提供的类是原生类的替代品(它们继承自它们)。

我们先简单看个例子,如:我们要获取 多伦多和温哥华的时间差。

代码实例


#-*- coding: utf-8 -*-
# @Time   : 2021-10-08
# @Author : Carl_DJ
import 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


安装完成就是这样的,截图如下:

image.png

当然,

如果不想每次都pip安装,直接看这两篇:


《Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!》

《Python3,我低调的只用一行代码,就导入Python所有库!》


2.3 实例化时区


2.3.1 默认时区展示


代码实例:


#-*- coding: utf-8 -*-
# @Time   : 2021-10-09
# @Author : Carl_DJ
import 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_DJ
import 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_DJ
import 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_DJ
import pendulum
dt_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()}')
#比较两个时区的差值是否相等
if  dt_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_DJ
import pendulum
dt_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 pendulum
dt_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()}')

输出结果:


温哥华和多伦多时间比较:<Period [2021-09-30T00:00:00+00:00 -> 2021-10-01T00:00:00+00:00]>
温哥华与默认时区时间比较:<Period [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_DJ
import 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_DJ
import pendulum
dt_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_DJ
import pendulum
dt = 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_DJ
import pendulum
dt = 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_DJ
import 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 做人性化输出。


目录
相关文章
|
29天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
35 6
|
17天前
|
Python
Python Internet 模块
Python Internet 模块。
116 74
|
2天前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
46 33
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
117 63
|
3天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
25 10
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
22天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
62 8
|
30天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
50 11
|
1月前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
40 11
|
27天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!