python中时间处理标准库DateTime加强版库:pendulum
1|0DateTime 的时区问题
Python的datetime可以处理2种类型的时间,分别为offset-naive
和offset-aware
。前者是指没有包含时区信息的时间,后者是指包含时区信息的时间,只有同类型的时间才能进行减法运算和比较。
datetime模块的函数在默认情况下都只生成offset-naive类型的datetime对象,例如now()、utcnow()、fromtimestamp()、utcfromtimestamp()和strftime()。
其中now()和fromtimestamp()可以接受一个tzinfo对象来生成offset-aware类型的datetime对象,但是标准库并不提供任何已实现的tzinfo类,只能自己实现。
一旦生成了一个offset-aware类型的datetime对象,我们就能调用它的astimezone()方法,生成其他时区的时间(会根据时差来计算)。
而如果拿到的是offset-naive类型的datetime对象,也是可以调用它的replace()方法来替换tzinfo的,只不过这种替换不会根据时差来调整其他时间属性。
因此,如果拿到一个格林威治时间的offset-naive类型的datetime对象,直接调用replace(tzinfo=UTC())即可转换成offset-aware类型,然后再调用astimezone()生成其他时区的datetime对象。
不带时区datetime实例
普通的datetime都是不带时区信息
带时区datetime实例
2|0pendulum
pendulum是对datetime的高级封装,主要是用的是带时区的datetime
3|0创建DateTime实例
pendulum是简化时间操作的模块。
特别注意确保正确处理时区,并基于底层tzinfo实现。例如,所有比较均以UTC或所用日期时间的时区进行。pendulum默认创建带时区的datetime,但时区并不是当地时区,而是标准时区UTC时区。
3|1创建
如果没有指明时分秒,那么就是00:00:00,并且时区是UTC。此外它也可以是Timezone实例或一个简单的时区字值
local
local 和 datetime()很类似,但是会自动设置时区为本地时区
local 类似于
pendulum.datetime(2015, 2, 5, tz='local')
now
now 和 local一样,也会自动设置时区为本地时区
today
获取当天的起始时间,零时零点。带时区
tommorrow
获取明天的起始时间,零时零点。带时区
yesterday
获取昨天的起始时间,零时零点,带时区
naive
不带时区实例
pendulum是强制使用时区的,使用它们是使用库的首选和推荐方式。但是如果你真的需要一个简单的DateTime对象,可以使用naive()
3|2从字符串创建
form_format
form_format和原生的datetime.strptime()很类似,但使用自定义标记创建DateTime实例。
同样可以接受一个时区
form_timestamp
最后一个助手用于处理unix时间戳。from_timestamp()将创建一个与给定时间戳相等的DateTime实例,并设置时区或将其默认为UTC。
instance
:从DateTime创建
如果你发现你继承了一个datetime.datetime的实例,你可以创建一个DateTime实例通过instance方法
parse
pendulum.parse() 可以将字符串转peewee对象,默认不设置本地时区,可通过tz手动添加时区。字符串格式支持:
- RFC 3339 format
- ISO 8601 formats
4|0pendulum 对象的属性和方法
4|1输出当前时刻的年月日,时分秒
4|2输出当前时刻是一年中的第几周,第几天,第几个月
4|3输出对象的时区相关,时区名字,时区类型本地时区或标准时区
4|4date和time属性
date通常是指年月日的时间
time通常是指时分秒的时间
pendulum属性中可以输出date和time
date
time
date,time都不是datetime类型的。所以在一些时间加减运算,比较等操作是date和time都不可以和pendulum直接运算。
date,time,datetime之间无法比较计算
5|0字符串输出格式
pendulum实例的输出格式,字符串的输出格式相关函数。
5|1date,time,datetime 相关字符串格式的输出
5|2自定义输出格式
format 比 strftime 使用更加直观,而且支持更多参数
可以使用的参数:
- | TOKEN | OUTPUT |
---|---|---|
YEAR | YYYY | 2000, 2001, 2002 ... 2012, 2013 |
YY | 00, 01, 02 ... 12, 13 | |
Y | 2000, 2001, 2002 ... 2012, 2013 | |
QUARTER | Q | 1 2 3 4 |
Qo | 1st 2nd 3rd 4th | |
MONTH | MMMM | January, February, March ... |
MMM | Jan, Feb, Mar ... | |
MM | 01, 02, 03 ... 11, 12 | |
M | 1, 2, 3 ... 11, 12 | |
Mo | 1st 2nd ... 11th 12th | |
DAY OF YEAR | DDDD | 001, 002, 003 ... 364, 365 |
DDD | 1, 2, 3 ... 4, 5 | |
DAY OF MONTH | DD | 01, 02, 03 ... 30, 31 |
D | 1, 2, 3 ... 30, 31 | |
Do | 1st, 2nd, 3rd ... 30th, 31st | |
DAY OF WEEK | dddd | Monday, Tuesday, Wednesday ... |
ddd | Mon, Tue, Wed ... | |
dd | Mo, Tu, We ... | |
d | 0, 1, 2 ... 6 | |
DAYS OF ISO WEEK | E | 1, 2, 3 ... 7 |
HOUR | HH | 00, 01, 02 ... 23, 24 |
H | 0, 1, 2 ... 23, 24 | |
hh | 01, 02, 03 ... 11, 12 | |
h | 1, 2, 3 ... 11, 12 | |
MINUTE | mm | 00, 01, 02 ... 58, 59 |
m | 0, 1, 2 ... 58, 59 | |
SECOND | ss | 00, 01, 02 ... 58, 59 |
s | 0, 1, 2 ... 58, 59 |
转义字符
要转义格式字符串中的字符,可以将字符括在方括号中。
6|0时间比较
pendulum的时间可以直接比较。但是只能限制在相同对象之间。如datetime和datetime之间可以比较,datetime和date无法比较,带时区对象和不带时区对象无法比较。
6|1pendulum对象之间比较
6|2datetime 和 date之间无法比较
6|3带时区和不带时区不可以比较
7|0时间加减运算
有一些需要对时间操作的场景,比如定时4个小时执行一段代码,这是需要对时间加减运算。时间加减返回DateTime实例,不会造成时区变化。加减运算仅限于同一种类型的时间。
方法:
- add 加法
- subtract 减法
pendulum支持的加减的时间颗粒度:
- years
- months
- days
- hours
- minutes
- seconds
同时也支持多个参数
8|0时间间距计算
8|1diff
diff 方法来计算两个时间之间的间距。但是时间间距计算只限于同一种类型,带时区和不带时区时间无法计算。
diff()方法返回一个Period实例,它表示两个DateTime实例之间的时间,这个间隔可以用不同的单位表示。
diff方法有两个参数,第一个参数是DateTime,第二个是可选参数,表示时间差距是否以相对值返回。默认情况下差距是绝对差距,即没有正负。默认是True,相对为False
绝对值
相对值
:
差值可以转换的时间颗粒度
- 天 in_days()
- 小时 in_hours()
- 分钟 in_minutes()
8|2时间间隔对象 period 属性和方法
当您从另一个DateTime实例中减去一个DateTime实例,或者使用diff()方法时,它将返回一个Period实例,可以叫做:时间间隔对象。
Period 继承了Duration类,还增加了一个好处,即它知道生成它的实例,因此它可以访问更多的方法和属性。Duration类继承自本机timedelta类。它对基类有很多改进。
period实例拥有的属性和方法:
从period中输出时间间隔的方法:
- 年:years
- 星期:weeks
- 月:months
- 天:days
- 小时:hours
- 分钟:minutes
8|3时间间隔 period 实例
可以创建一个持续周期实例,来完成一些转换。
如果你想获得每个支持单元的持续时间,你可以使用适当的方法。将所有的时间以周,天,小时的时间来计算。
9|0pendulum常用方法
9|1获取时区的方法
9|2转换时区
可以使用in_timezone()方法轻松更改DateTime实例的时区。
注意:需要避免在python3.6之前使用时区库
9|3period实例的创建
可以通过period()来创建一个实例。
9|4起始日期
pendulum提供了起始日期的获取方法
开始时间
获取一个时间的开始时间,可以为:year,month,day,week
截止日期
获取一个时间的截止日期,可以为year,month,day,week
9|5迭代时间范围
如果希望在一个周期内进行迭代,可以使用range()方法。使用period对象的range方法,可以产生一个以参数为粒度的可迭代时间对象。
9|6修改时间
pendulum提供一些帮助,通过对旧实例修改,返回一个新的实例。
但是,除了显式设置时区外,这些帮助程序都不会更改实例的时区。具体而言,设置时间戳不会将相应的时区设置为UTC。
in_timezone()
in_tz()
可以将时间转化到设置的时区。
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/15292216.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理