Python处理日期时间:Arrow库

目录
  1. 1. 简介
  2. 2. 快速入门
  3. 3. 时间的创建
    1. 3.1. 当前时间
    2. 3.2. 时间戳
    3. 3.3. 字符串
    4. 3.4. 按位传入时间值
  4. 4. 属性
  5. 5. 格式化
  6. 6. 替换
  7. 7. 移动
  8. 8. 时区转换
  9. 9. 时区的表示方法
  10. 10. 人性化
  11. 11. 范围和跨度
  12. 12. Tokens
  13. 13. 参考

简介

Arrow 提供了一个友好而且非常易懂的方法,用于创建时间、计算时间、格式化时间,还可以对时间做转化、提取、兼容 python datetime 类型。

安装方法:

pip install arrow -U

导入方法:

import arrow

快速入门

以下是一些最常用的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import arrow

# 解析字符为时间
arrow.get('2020-08-01T21:23:58.970460+07:00')
# <Arrow [2020-08-01T21:23:58.970460+07:00]>

utc = arrow.utcnow() # 取当前 utc 时间
utc
# <Arrow [2020-08-01T21:23:58.970460+00:00]>

utc = utc.shift(hours=-1) # 向前一小时
utc
# <Arrow [2020-08-01T20:23:58.970460+00:00]>

# 转换为北京时间
local = utc.to('Asia/Shanghai')
local
# <Arrow [2020-08-01T13:23:58.970460-08:00]>

local.timestamp # 时间戳
# 1368303838

local.format() # 格式化时间
# '2020-08-01 13:23:58 -07:00'

# 指定格式
local.format('YYYY-MM-DD HH:mm:ss ZZ')
# '2020-07-30 19:21:30 +08:00'

local.humanize() # 时间人性化,说人话
# 'an hour ago'

local.humanize(locale='zh_cn') # 说中国话
# '11秒前'

看完你应该入门了。

时间的创建

arrow 创建时间,会生成一个 Arrow 对象

当前时间

以下创建一个当前时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import arrow

# 当前的本地时间
arrow.now()
# <Arrow [2020-07-30T14:20:46.539623+08:00]>

# 现在的 utc 时间
arrow.utcnow()
# <Arrow [2020-07-30T03:44:46.706647+00:00]>

# 当前的美国太平洋时间
arrow.now('US/Pacific')
# <Arrow [2020-07-29T23:21:33.349793-07:00]>

# 当前北京时间
arrow.now('Asia/Shanghai')
# <Arrow [2020-07-30T14:22:16.082242+08:00]>

arrow.get('20200801 19:23:23')
# <Arrow [2020-08-01T19:23:23+00:00]>

时间戳

根据整型或者浮点型时间戳创建时间:

1
2
3
4
5
arrow.get(1599878923)
# <Arrow [2020-09-12T02:48:43+00:00]>

arrow.get(1599878923.183723)
# <Arrow [2020-09-12T02:48:43.183723+00:00]>

字符串

支持ISO 8601规定的格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 带毫秒及时区,北京时间
arrow.get('2020-08-01T12:23:58.970460+08:00')
# <Arrow [2020-08-01T12:23:58.970460+08:00]>

arrow.get('20200801 19:23:23')
# <Arrow [2020-08-01T19:23:23+00:00]>

arrow.get('20200801')
# <Arrow [2020-08-01T00:00:00+00:00]>

# 解析文本,指定格式
arrow.get('June was born in May 2010', 'MMMM YYYY')
# <Arrow [2010-05-01T00:00:00+00:00]>

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

按位传入时间值

1
2
3
4
5
arrow.get(2020, 8, 1, 17)
# <Arrow [2020-08-01T17:00:00+00:00]>

arrow.Arrow(2020, 8, 1, 17)
# <Arrow [2020-08-01T17:00:00+00:00]>

属性

Arrow 对象支持很多实用的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
t = arrow.now() # 创建一个本地当前时间
t
# <Arrow [2020-07-31T11:08:25.334956+08:00]>

t.datetime # datetime 格式
t.naive # 本地 datetime
# datetime.datetime(2020, 7, 31, 11, 8, 25, 334956, tzinfo=tzlocal())

t.timestamp # 时间戳
# 1596164905

t.tzinfo # 时区
# tzlocal()

t.year # 2020 年数字
t.quarter # 3 季度
t.month # 7 月
t.week # 31 周数
t.day # 31 日数
t.hour # 11 小时数
t.minute # 8 分钟数
t.second # 25 秒数
t.microsecond # 334956 微秒
t.weekday() # 4 周五,从0开始

t.date() # datetime 类型,年月日
# datetime.date(2020, 7, 31)
t.time() # datetime 类型的时分秒微秒
# datetime.time(11, 8, 25, 334956)
t.ctime() # ctime 格式
# 'Fri Jul 31 11:08:25 2020'

t.max # 最大时间
# <Arrow [9999-12-31T23:59:59.999999+00:00]>
t.min # 最小时间
# <Arrow [0001-01-01T00:00:00+00:00]>

格式化

格式化(Format)是指把时间转为人类易读的字符串形式。

1
2
3
4
a = arrow.now()
a.format()
a.format('YYYY-MM-DD HH:mm:ss ZZ')
# '2020-05-27 10:30:35 +08:00'

arrow 内置了一些格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a.= arrow.utcnow()
a.format(arrow.FORMAT_ATOM)
# '2020-05-27 10:30:35+00:00'
a.format(arrow.FORMAT_COOKIE)
# 'Wednesday, 27-May-2020 10:30:35 UTC'
a.format(arrow.FORMAT_RSS)
# 'Wed, 27 May 2020 10:30:35 +0000'
a.format(arrow.FORMAT_RFC822)
# 'Wed, 27 May 20 10:30:35 +0000'
a.format(arrow.FORMAT_RFC850)
# 'Wednesday, 27-May-20 10:30:35 UTC'
a.format(arrow.FORMAT_RFC1036)
# 'Wed, 27 May 20 10:30:35 +0000'
a.format(arrow.FORMAT_RFC1123)
# 'Wed, 27 May 2020 10:30:35 +0000'
a.format(arrow.FORMAT_RFC2822)
# 'Wed, 27 May 2020 10:30:35 +0000'
a.format(arrow.FORMAT_RFC3339)
# '2020-05-27 10:30:35+00:00'
a.format(arrow.FORMAT_W3C)
# '2020-05-27 10:30:35+00:00'

替换

可以对时间中的日期、小时等进行替换,以达到修改时间的目的,比如我们只要日期,可以将时分秒替换为 0。修改时区,也可以通过替换时间来实现。

1
2
3
4
5
6
7
8
9
a = arrow.utcnow()
a
# <Arrow [2020-07-31T03:38:36.198675+00:00]>
a.replace(year=2021, month=8) # 修改年份和月份
# <Arrow [2021-08-31T03:38:36.198675+00:00]>
a.replace(tzinfo='US/Pacific') # 修改时区
# <Arrow [2020-07-31T03:38:36.198675-07:00]>
a.replace(tzinfo='Asia/Shanghai') # 修改为北京时间
# <Arrow [2020-07-31T03:38:36.198675+08:00]>

需要注意的是,替换修改时间时,要保证最终的时间是一个合法的时间,如上例中的月份不能修改为 2 月。

移动

移动(Shift)是指可以将指定时间向前或者向后移动一定周期,如明天的此时,去年的今日。

1
2
3
4
5
6
7
8
9
a.shift(weeks=+3) # 向未来三周
# <Arrow [2020-08-21T03:38:36.198675+00:00]>
a.shift(hours=-2) # 过去两小时
# <Arrow [2020-07-31T01:38:36.198675+00:00]>
a.shift(years=1, months=-1) # 向未来一年,再向前一月
# <Arrow [2021-06-30T03:38:36.198675+00:00]>
a.shift(weekday=5) # 移到未来最近的周六
# <Arrow [2020-08-01T09:43:26.569633+00:00]>
a.shift(weekday=0) # 周日

时区转换

除了上文 replace 方法转换外,还有专门的时区转换方法。以下从 utc 转到北京时间:

1
2
3
4
5
6
7
8
9
10
utc = arrow.utcnow()
utc
# <Arrow [2020-07-31T04:55:52.176325+00:00]>
utc.to('Asia/Shanghai')
utc.to(tz.gettz('Asia/Shanghai'))
# <Arrow [2020-07-31T04:55:52.176325+08:00]>
utc.to('local')
# <Arrow [2020-07-31T04:55:52.176325+08:00]>
utc.to('local').to('utc')
# <Arrow [2020-07-31T04:55:52.176325+00:00]>

时区的表示方法

公认的时区表达式:

  • tzinfo 对象.
  • str 时区描述符, similar to ‘US/Pacific’, or ‘Europe/Berlin’.
  • str ISO 8601 风格, 如 ‘+07:00’.
  • str, 特殊字符: ‘local’, ‘utc’, ‘UTC’.

人性化

人性化(Humanize)时间,是指将时间转化为人类易于主观识别的时间表达。以下是和当前时间对比:

1
2
3
4
5
6
a = arrow.utcnow()
a.humanize()
# 'just now'

a.shift(hours=-1).humanize()
# 'an hour ago'

也可以与另外一个指定的时间作对比:

1
2
3
4
5
6
7
8
a.humanize(a.shift(days=1))
# 'a day ago'
a.humanize(a.shift(hours=1))
# 'an hour ago'

# 只留下长度
a.humanize(a.shift(hours=1), only_distance=True)
# 'an hour'

可以指定单位:

1
2
3
4
5
6
7
8
9
10
11
# 单位为分钟
a.humanize(a.shift(minutes=66), granularity="minute")
# '66 minutes ago'
# 单位为时分
a.humanize(a.shift(minutes=66), granularity=["hour", "minute"])
# 'an hour and 6 minutes ago'
# 只留时长
a.humanize(a.shift(minutes=66),
granularity=["hour", "minute"],
only_distance=True,)
# 'an hour and 6 minutes'

可以使用中文等其他语言:

1
2
3
4
5
# 指定为中文
utc.humanize(locale='zh_cn')
# '17分钟前'
a.humanize(a.shift(days=1), locale='zh_cn')
# '1天前'

范围和跨度

可以定义一个时间区间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
arrow.utcnow().span('hour') # 一个小时
# (<Arrow [2020-05-07T05:00:00+00:00]>, <Arrow [2020-05-07T05:59:59.999999+00:00]>)

arrow.utcnow().floor('hour') # 最小
# <Arrow [2020-05-07T05:00:00+00:00]>

arrow.utcnow().ceil('hour') # 最大
# <Arrow [2020-05-07T05:59:59.999999+00:00]>

start = datetime(2020, 5, 5, 12, 30)
end = datetime(2020, 5, 5, 17, 15)
for r in arrow.Arrow.span_range('hour', start, end):
print(r)

'''
(<Arrow [2020-05-05T12:00:00+00:00]>, <Arrow [2020-05-05T12:59:59.999999+00:00]>)
(<Arrow [2020-05-05T13:00:00+00:00]>, <Arrow [2020-05-05T13:59:59.999999+00:00]>)
(<Arrow [2020-05-05T14:00:00+00:00]>, <Arrow [2020-05-05T14:59:59.999999+00:00]>)
(<Arrow [2020-05-05T15:00:00+00:00]>, <Arrow [2020-05-05T15:59:59.999999+00:00]>)
(<Arrow [2020-05-05T16:00:00+00:00]>, <Arrow [2020-05-05T16:59:59.999999+00:00]>)
'''

start = datetime(2020, 5, 5, 12, 30)
end = datetime(2020, 5, 5, 17, 15)
for r in arrow.Arrow.range('hour', start, end):
print(repr(r))

'''
<Arrow [2020-05-05T12:30:00+00:00]>
<Arrow [2020-05-05T13:30:00+00:00]>
<Arrow [2020-05-05T14:30:00+00:00]>
<Arrow [2020-05-05T15:30:00+00:00]>
<Arrow [2020-05-05T16:30:00+00:00]>
'''

Tokens

Token Output
Year YYYY 2000, 2001, 2002 … 2012, 2013
YY 00, 01, 02 … 12, 13
Month MMMM January, February, March …
MMM Jan, Feb, Mar …
MM 01, 02, 03 … 11, 12
M 1, 2, 3 … 11, 12
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
Day of Week dddd Monday, Tuesday, Wednesday …
ddd Mon, Tue, Wed …
d 1, 2, 3 … 6, 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
AM / PM A AM, PM
a am, pm
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
Sub-second SSS 000, 001, 002 … 998, 999
SS 00, 01, 02 … 98, 99
S 0, 1, 2 … 8, 9
Timezone ZZ -07:00, -06:00 … +06:00, +07:00
Z -0700, -0600 … +0600, +0700
Timestamp X 1381685817

参考

转自:Arrow: Python 日期时间库