你还在用datetime模块吗?Arrow更值得你使用

举报
芥末拌个饭吧 发表于 2022/11/15 09:23:07 2022/11/15
【摘要】 说到Python是如何处理时间日期的,你可能马上会想到datetime、time、dateutil等模块。它们都是Python的标准库,确实能用来处理时间日期问题。但众多模块分别处理不同的问题,加上时区和时间戳的转换不够友好,因此体验不是很好。 那么有没有一个模块,能集成上述所有的功能,体验更人性化呢?有,那就是今天的主角:Arrow模块。

前言

说到Python是如何处理时间日期的,你可能马上会想到datetime、time、dateutil等模块。它们都是Python的标准库,确实能用来处理时间日期问题。但众多模块分别处理不同的问题,加上时区和时间戳的转换不够友好,因此体验不是很好。

那么有没有一个模块,能集成上述所有的功能,体验更人性化呢?有,那就是今天的主角:Arrow模块

Arrow的安装

安装很简单,输入pip install arrow即可。需要注意的是:arrow仅支持Python3.6之后的版本,如果你的Python版本小于Python3.6,需要升级一下版本了。

Arrow的使用

arrow是第三方库,对于时间的操作都是基于arrow对象,获取到arrow对象后,需要什么操作,调用对象的相应方法或属性就行了,用起来非常的方便。

arrow在功能上完全可替代标准库time、datetime等库,做时间日期的格式化、转换等操作,记住arrow就够了。

获取当前时间

In [1]: import arrow

In [2]: arrow.now()
Out[2]: <Arrow [2022-10-09T14:19:23.526083+08:00]>

In [3]: arrow.utcnow()
Out[3]: <Arrow [2022-10-09T06:19:30.451118+00:00]>

In [4]: arrow.now('US/Pacific')
Out[4]: <Arrow [2022-10-08T23:21:49.861943-07:00]>

通过arrow.utcnow()得到的是世界标准时间。通常我们用arrow.now()来获取本地时间,如果要获取特定时区的时间,比如要获取美国时间,输入arrow.now('US/Pacific')来获取。

时间戳及格式化转换

时间戳转换

在datetime中时间戳的转换,个人认为比较麻烦。比如有一个时间字符串需要将它转为时间戳,做法如下:

In [28]: import time

In [29]: time_str = "2020-10-09 12:20:00"

In [30]: #转换成时间数组
    ...: timeArray = time.strptime(dt, "%Y-%m-%d %H:%M:%S")

In [31]: #转换成时间戳
    ...: timestamp = time.mktime(timeArray)

In [32]: timestamp
Out[32]: 1462451334.0

用标准库的话拿到时间字符串,要先将它格式化,再获取到对应的时间戳。

而用arrow就方便多了,直接转为arrow对象,然后调用timestamp即可。

In [33]: import arrow

In [34]: time_str = "2020-10-09 12:20:00"

In [35]: # 获取时间字符串的时间戳
    ...: timestamp = arrow.get(time_str).timestamp()

In [36]: timestamp
Out[36]: 1602246000.0

In [37]: # 再转为arrow对象
    ...: arrow_time = arrow.get(timestamp)

In [38]: arrow_time
Out[38]: <Arrow [2020-10-09T12:20:00+00:00]>

时间形式格式化:format搞定一切

如果想转换时间格式呢?那也简单,在arrow中只要获取到arrow对象,再调用对应的方法即可。

比如要进行时间字符串的格式化,获取到arrow对象再format就行了,示例:

In [44]: time_str = "2020-10-09 12:20:00"

In [45]: arrow_time = arrow.get(time_str).format('YYYY-MM-DD')

In [46]: arrow_time
Out[46]: '2020-10-09'

其他时间格式转为arrow对象

arrow中用arrow.get({时间格式})即可将各种不同的时间格式转为arrow对象,使用起来非常方便。

来几个例子:

# 字符串转arrow对象
In [39]: arrow.get('2020-10-09 12:20:00', 'YYYY-MM-DD HH:mm:ss')
Out[39]: <Arrow [2020-10-09T12:20:00+00:00]>

In [40]: arrow.get('2020-10-09 12:20:00')
Out[40]: <Arrow [2020-10-09T12:20:00+00:00]>

In [41]: arrow.get(2020,10,9)
Out[41]: <Arrow [2020-10-09T00:00:00+00:00]>

In [42]: arrow.get(2020,10,9, 12)
Out[42]: <Arrow [2020-10-09T12:00:00+00:00]>

In [43]: arrow.get(2020,10,9, 12,20)
Out[43]: <Arrow [2020-10-09T12:20:00+00:00]>

# 也可使用arrow.Arrow来获取arrow对象
In [44]: arrow.Arrow(2020,10,9)
Out[44]: <Arrow [2020-10-09T00:00:00+00:00]>

arrow对象有哪些属性

我们获取到arrow对象后,可以直接使用它的相关属性如年月日等。主要属性有:

In [54]: t = arrow.now()

In [55]: t
Out[55]: <Arrow [2022-10-09T15:15:30.724130+08:00]>

In [56]: t.year  # 获取年份
Out[56]: 2022

In [57]: t.month # 获取月份
Out[57]: 10

In [58]: t.day # 获取一个月的第几天
Out[58]: 9

In [59]: t.hour # 获取小时
Out[59]: 15

In [60]: t.minute # 获取分钟
Out[60]: 15

In [61]: t.second # 获取秒数
Out[61]: 30

In [62]: t.week # 获取一年中的第几周
Out[62]: 40

arrow如何进行时间计算

时间计算在工作中几乎都会碰到,比如计算10天后的日期。arrow中直接调用arrow对象的shift方法,使用起来非常方便。来几个例子就懂了:

In [64]: t = arrow.now()

In [65]: t
Out[65]: <Arrow [2022-10-09T15:23:42.000659+08:00]>

In [66]: # 计算10天前的时间

In [67]: t.shift(days=-10)
Out[67]: <Arrow [2022-09-29T15:23:42.000659+08:00]>

In [68]: # 2周后的时间

In [69]: t.shift(weeks=2)
Out[69]: <Arrow [2022-10-23T15:23:42.000659+08:00]>

In [70]: # 3个月前的时间

In [71]: t.shift(months=-3)
Out[71]: <Arrow [2022-07-09T15:23:42.000659+08:00]>

In [72]: # 上一年的时间

In [73]: t.shift(years=-1)
Out[73]: <Arrow [2021-10-09T15:23:42.000659+08:00]>

区域转换

有些场景我们需要对时间进行区域转换,比如获取美国时间。

arrow中用to()方法即可实现,看例子:

In [84]: local_time = arrow.now()
# 本地时间
In [85]: local_time.format('YYYY-MM-DD HH:mm:ss')
Out[85]: '2022-10-09 15:32:36'
# 美国时间
In [86]: local_time.to('US/Pacific').format('YYYY-MM-DD HH:mm:ss')
Out[86]: '2022-10-09 00:32:36'
# 莫斯科时间
In [87]: local_time.to('Europe/Moscow').format('YYYY-MM-DD HH:mm:ss')
Out[87]: '2022-10-09 10:32:36'

工作日/星期获取

获取一个时间是星期几,在arrow中使用weekday()方法或者通过format('dddd')即可获取。看例子:

In [90]: local_time = arrow.now()

In [91]: local_time
Out[91]: <Arrow [2022-10-09T15:36:55.056116+08:00]>

In [92]: local_time = arrow.now()

In [93]: local_time.format('YYYY-MM-DD HH:mm:ss')
Out[93]: '2022-10-09 15:37:16'

In [94]: local_time.weekday()
Out[94]: 6

In [95]: local_time.format('dddd')
Out[95]: 'Sunday'

小结

这里总结了Python第三方库Arrow的用法,当你感觉到标准库处理时间很麻烦的时候,用Arrow试试吧,它用法简单,功能却很强大。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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