Arrow是一个Python库,它提供了一种明智且人性化的方法来创建,操作,格式化和转换日期,时间和时间戳。它实现并更新了日期时间类型,填补了功能上的空白,并提供了支持许多常见创建方案的智能模块API。简而言之,它可以帮助您以更少的导入和更少的代码来处理日期和时间。
Arrow以时间之箭命名,灵感来自moment.js和请求。
为什么在内置模块上使用Arrow?
Python的标准库和其他一些底层模块具有几乎完整的日期,时间和时区功能,但是从可用性的角度来看效果并不理想:太多模块:日期时间,时间,日历,dateutil,pytz等
类型太多:日期,时间,日期时间,tzinfo,timedelta,relativedelta等。
时区和时间戳转换冗长且令人不快
时区朴素是常态
功能上的差距:ISO 8601解析,时间跨度,人性化
功能完全实现的日期时间直接替换
支持Python 2.7、3.5、3.6、3.7、3.8和3.9
默认为时区感知和UTC
为许多常见的输入方案提供超简单的创建选项
shift 支持相对偏移量(包括周)的方法
自动格式化和解析字符串
广泛支持ISO 8601
时区转换
时间戳记可作为属性使用
生成时间范围,范围,下限和上限,以显示从微秒到年的时间范围
人性化并支持不断增加的贡献区域列表
可扩展为您自己的箭头衍生类型
快速入门
安装
要安装Arrow,请使用pip或pipenv:
$ pip install -U arrow
用法示例
>>> import arrow >>>arrow.get('2013-05-11T21:23:58.970460+07:00') >>>utc = arrow.utcnow() >>>utc >>>utc = utc.shift(hours=-1) >>>utc >>>local = utc.to('US/Pacific') >>>local >>>local.timestamp 1368303838 >>>local.format() '2013-05-11 13:23:58 -07:00' >>>local.format('YYYY-MM-DD HH:mm:ss ZZ') '2013-05-11 13:23:58 -07:00' >>>local.humanize() 'an hour ago' >>>local.humanize(locale='ko_kr') '1시간 전'
用户指南
创建
轻松获取“现在”:
>>>arrow.utcnow() >>>arrow.now() >>>arrow.now('US/Pacific')
从时间戳创建(int或float):
>>>arrow.get(1367900664) >>>arrow.get(1367900664.152325)
使用天真的或时区感知的日期时间,或灵活指定时区:
>>>arrow.get(datetime.utcnow()) >>>arrow.get(datetime(2013, 5, 5), 'US/Pacific') >>> from dateutil import tz >>>arrow.get(datetime(2013, 5, 5), tz.gettz('US/Pacific')) >>>arrow.get(datetime.now(tz.gettz('US/Pacific')))
从字符串解析:
>>>arrow.get('2013-05-05 12:30:45', 'YYYY-MM-DD HH:mm:ss')
在字符串中搜索日期:
>>>arrow.get('June was born in May 1980', 'MMMM YYYY')
某些不符合格式8的ISO 8601兼容字符串可以被识别和解析:
>>>arrow.get('2013-09-30T15:34:00.000-07:00')
箭头对象也可以直接实例化,其参数与日期时间相同:
>>>arrow.get(2013, 5, 5) >>>arrow.Arrow(2013, 5, 5)
属性
获取日期时间或时间戳表示:
>>>a = arrow.utcnow() >>>a.datetime datetime.datetime(2013, 5, 7, 4, 38, 15, 447644, tzinfo=tzutc()) >>>a.timestamp 1367901495
获取原始日期时间和tzinfo:
>>>a.naive datetime.datetime(2013, 5, 7, 4, 38, 15, 447644) >>>a.tzinfo tzutc()
获取任何日期时间值:
>>>a.year 2013
调用返回属性的datetime函数:
>>>a.date() datetime.date(2013, 5, 7) >>>a.time() datetime.time(4, 38, 15, 447644)
替换和移位
获取一个>>>arw = arrow.utcnow() >>>arw >>>arw.replace(hour=4, minute=40)
或者,获得一个属性向前或向后移动的对象:
>>>arw.shift(weeks=+3)
甚至可以在不更改其他属性的情况下替换时区:
>>>arw.replace(tzinfo='US/Pacific')
在歧义时间的较早和较晚时刻之间移动:
>>>paris_transition = arrow.Arrow(2019, 10, 27, 2, tzinfo="Europe/Paris", fold=0) >>>paris_transition >>>paris_transition.ambiguous True >>>paris_transition.replace(fold=1)
格式
>>>arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ') '2013-05-07 05:23:16 -00:00'
转换
通过名称或tzinfo将UTC转换为其他时区:
>>>utc = arrow.utcnow() >>>utc >>>utc.to('US/Pacific') >>>utc.to(tz.gettz('US/Pacific'))
或使用速记:
>>>utc.to('local') >>>utc.to('local').to('utc')
人性化
相对于现在的人性化:
>>>past = arrow.utcnow().shift(hours=-1) >>>past.humanize() 'an hour ago'
或另一个箭头或日期时间:
>>>present = arrow.utcnow() >>>future = present.shift(hours=2) >>>future.humanize(present) 'in 2 hours'
将时间表示为相对时间或仅包括距离
>>>present = arrow.utcnow() >>>future = present.shift(hours=2) >>>future.humanize(present) 'in 2 hours' >>>future.humanize(present, only_distance=True) '2 hours'
指示特定的时间粒度(或多个):
>>>present = arrow.utcnow() >>>future = present.shift(minutes=66) >>>future.humanize(present, granularity="minute") 'in 66 minutes' >>>future.humanize(present, granularity=["hour", "minute"]) 'in an hour and 6 minutes' >>>present.humanize(future, granularity=["hour", "minute"]) 'an hour and 6 minutes ago' >>>future.humanize(present, only_distance=True, granularity=["hour", "minute"]) 'an hour and 6 minutes'
支持越来越多的语言环境(locales.py有关支持的语言,请参见):
>>>future = arrow.utcnow().shift(hours=1) >>>future.humanize(a, locale='ru') 'через 2 час(а,ов)'
范围和跨度
获取任何单位的时间跨度:
>>>arrow.utcnow().span('hour') (, )
或者只是获得地板和天花板:
>>>arrow.utcnow().floor('hour') >>>arrow.utcnow().ceil('hour')
您还可以获得一个时间范围:
>>>start = datetime(2013, 5, 5, 12, 30) >>>end = datetime(2013, 5, 5, 17, 15) >>> for r in arrow.Arrow.span_range('hour', start, end): ... print r ... (, ) (, ) (, ) (, ) (, )
或者只是遍历一段时间:
>>>start = datetime(2013, 5, 5, 12, 30) >>>end = datetime(2013, 5, 5, 17, 15) >>> for r in arrow.Arrow.range('hour', start, end): ... print repr(r) ...
工厂
使用工厂为自定义的Arrow派生类型利用Arrow的模块API。首先,导出您的类型:
>>> class CustomArrow(arrow.Arrow): ... ... def days_till_xmas(self): ... ... xmas = arrow.Arrow(self.year, 12, 25) ... ... if self > xmas: ... xmas = xmas.shift(years=1) ... ... return (xmas - self).days
然后获取并使用工厂:
>>>factory = arrow.ArrowFactory(CustomArrow) >>>custom = factory.utcnow() >>>custom >>> >>>custom.days_till_xmas() >>>211
支持令牌
使用以下标记进行解析和格式化。请注意,他们是不一样的令牌strptime:112211aable data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">3able data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">45ata-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">