每日一包 - arrow

296 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

介绍

arrow为创建、操作、格式化和转换日期、时间和时间戳提供了一种合理且人性化的方法,简单来讲该模块可以帮助我们用更少的的代码处理日期和时间。

在Python中也有标准库来处理日期和时间,那么为什么还要使用arrow呢?在使用Python内置的time、datetime等模块时,各种格式的时间日期格式转换是非常麻烦的,而arrow则解决了这个问题,提供了更加简单的方式进行时间格式转换。

Python3.6及以上版本才支持arrow模块,该模块基本上可以替代datetime模块的功能。

使用

安装

pip install arrow

使用 - 获取时间

可以直接获取当前时间(now)

arrow.utcnow()
<Arrow [2013-05-07T04:20:39.369271+00:00]>
​
arrow.now()
<Arrow [2013-05-06T21:20:40.841085-07:00]>
​
arrow.now('US/Pacific')
<Arrow [2013-05-06T21:20:44.761511-07:00]>

也可以将int或者float类型的时间戳进行格式转换

arrow.get(1367900664)
<Arrow [2013-05-07T04:24:24+00:00]>
​
arrow.get(1367900664.152325)
<Arrow [2013-05-07T04:24:24.152325+00:00]>

也支持从根据格式从字符串中解析出时间

arrow.get('2013-05-05 12:30:45', 'YYYY-MM-DD HH:mm:ss')
<Arrow [2013-05-05T12:30:45+00:00]>

甚至支持从一个非时间格式的字符串中获取到该字符串的时间。

arrow.get('June was born in May 1980', 'MMMM YYYY')
<Arrow [1980-05-01T00:00:00+00:00]>

arrow对象也可以直接实例化,参数和datetime是一致的。

arrow.get(2013, 5, 5)
<Arrow [2013-05-05T00:00:00+00:00]>
​
arrow.Arrow(2013, 5, 5)
<Arrow [2013-05-05T00:00:00+00:00]>

使用 - 属性

  • datetime - 获取日期或者时间戳
a = arrow.utcnow()
a.datetime
datetime.datetime(2013, 5, 7, 4, 38, 15, 447644, tzinfo=tzutc())
  • 获取对象中的具体值,比如年月日等
a.year  # 年份
2013
​
a.date()  # 日期
datetime.date(2013, 5, 7)
​
a.time()  # 时间
datetime.time(4, 38, 15, 447644)

使用 - 格式化

可以通过指定时间的格式来对arrow进行格式化操作

arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ')
'2013-05-07 05:23:16 -00:00'

使用 - 修改

获取一个arrow对象之后,可以对得到的值进行修改或者进行加减操作。

# 修改值
arw = arrow.utcnow()
arw
<Arrow [2013-05-12T03:29:35.334214+00:00]>
​
arw.replace(hour=4, minute=40)
<Arrow [2013-05-12T04:40:35.334214+00:00]>
# 加减值
arw.shift(weeks=+3)
<Arrow [2013-06-02T03:29:35.334214+00:00]>

使用 - 时区转换

可以通过时区的名称将UTC时区改为其他时区。

utc = arrow.utcnow()
utc
<Arrow [2013-05-07T05:24:11.823627+00:00]>
​
utc.to('US/Pacific')
<Arrow [2013-05-06T22:24:11.823627-07:00]>
​
utc.to(tz.gettz('US/Pacific'))
<Arrow [2013-05-06T22:24:11.823627-07:00]>

使用 - 支持的格式

下述表格列举了arrow可以解析或者个事啊的时间或者日期格式。

tokenoutput
YearYYYY2000, 2001, 2002 … 2012, 2013
YY00, 01, 02 … 12, 13
MonthMMMMJanuary, February, March …
MMMJan, Feb, Mar …
MM01, 02, 03 … 11, 12
M1, 2, 3 … 11, 12
Day of YearDDDD001, 002, 003 … 364, 365
DDD1, 2, 3 … 364, 365
Day of MonthDD01, 02, 03 … 30, 31
D1, 2, 3 … 30, 31
Do1st, 2nd, 3rd … 30th, 31st
Day of WeekddddMonday, Tuesday, Wednesday …
dddMon, Tue, Wed …
d1, 2, 3 … 6, 7
ISO week dateW2011-W05-4, 2019-W17
HourHH00, 01, 02 … 23, 24
H0, 1, 2 … 23, 24
hh01, 02, 03 … 11, 12
h1, 2, 3 … 11, 12
AM / PMAAM, PM, am, pm
aam, pm
Minutemm00, 01, 02 … 58, 59
m0, 1, 2 … 58, 59
Secondss00, 01, 02 … 58, 59
s0, 1, 2 … 58, 59
Sub-secondS…0, 02, 003, 000006, 123123123123…
TimezoneZZZAsia/Baku, Europe/Warsaw, GMT …
ZZ-07:00, -06:00 … +06:00, +07:00, +08, Z
Z-0700, -0600 … +0600, +0700, +08, Z
Seconds TimestampX1381685817, 1381685817.915482 …
ms or µs Timestampx1569980330813, 1569980330813221

总结

该模块还有一些更加人性化的使用方式,比如下述代码:

past = arrow.utcnow().shift(hours=-1)
past.humanize()
'an hour ago'

但是在实际开发中并不经常使用,有兴趣的小伙伴可以在官方文档中进行学习哦~