日期和时间模块-arrow日期时间模块
简介
官方介绍如下:
Arrow is a Python library that offers a sensible and human-friendly approach to creating, manipulating, formatting and converting dates, times and timestamps. It implements and updates the datetime type, plugging gaps in functionality and providing an intelligent module API that supports many common creation scenarios. Simply put, it helps you work with dates and times with fewer imports and a lot less code.
Arrow is named after the arrow of time and is heavily inspired by moment.js and requests.
即:Arrow是一个Python库,它提供了一种明智且人性化的方法来创建、处理、格式化和转换日期、时间和时间戳。 它实现并更新了日期时间类型,填补了功能上的空白,并提供了支持许多常见创建方案的智能模块API。 简而言之,它可以帮助您以更少的导入和更少的代码来处理日期和时间。
Arrow以(Arrow of time)时间之箭命名,灵感来自moment.js和requests模块。
为什么在内置模块上使用Arrow?
Python的标准库和其他一些底层模块具有几乎完整的日期,时间和时区功能,但是从可用性的角度来看,效果并不理想:
太多模块:datetime,time,calendar,dateutil,pytz等。
类型太多:date,time,datetime,tzinfo,timedelta,relativedelta等。
时区和时间戳转换是冗长不方便的。
时区朴素(即无时区信息)是常态。
功能上的差距:ISO 8601解析,时间跨度,人性化等。
安装
| |
查看arrow模块有哪些函数或方法:
| |
快速生成日期、时间字符串
| |
时区图

注:图中的GMT是指格林威治标准时间,也就是UTC标准时间,可参考格林威治标准时间 。
创建
通过now或utcnow创建时间对象
创建现在时间更加简单!
| |
通过时间戳创建时间对象
通过时间戳创建时间对象时,时间戳支持int和float类型。
| |
通过无时区/有时区信息的datetime或者指定时区
| |
通过解析时间字符串
| |
在字符串中搜索时间对象
| |
在不使用格式字符串的情况下,可以识别和解析一些符合ISO 8601的字符串
| |
直接实例化
Arrow对象也可以直接实例化,只需要传入类似datetime对象一样的参数即可。
| |
获取属性
datetime对象
获取datetime属性:
| |
timestamp时间戳
获取timestamp时间戳:
| |
无时区datetime对象和tzinfo
可以通过naive属性获取无时区datetime对象,tzinfo属性获取tzinfo信息。
| |
datetime年月月等信息
| |
调用datetime的功能返回属性值
| |
Replace替换或Shift移位
你可以像datetime一样,对arrow对象进行替换和修改。注意,替换或移位时不会对原来的对象进行修改,只会生成一个新的对象。
| |
或者直接使用shift来向前或向后改变属性:
| |
格式化
可以使用format方法进对arrow对象进行格式化。
| |
时区转换
可以很好地将UTC标准时间转换成其他时区的时间:
| |
也可以使用一些速记方式:
| |
人性化设置
时间的相对关系更加人性化:
| |
查看所有支持的语言:
| |
Range范围或Span跨度
获取时间跨度:
| |
时间向上或向下取值:
| |
你也可以获取指定时间区域的时间跨度:
| |
或者仅遍历一段时间:
| |
工厂模式
使用工厂模式将Arrow的模块API应用于自定义的Arrow衍生类型。 首先,编写您的自定义类,以及相应的方法,然后获取并使用工厂函数。
如下面的定义的CustomArrow类继承自Arrow类,并在其中定义了一个days_till_xmas方法。通过ArrowFactory(CustomArrow)构建一个工厂对象,然后再生成一个Arrow时间对象,最后调用自定义的days_till_xmas方法!
在pycham中测试:
| |
在ipython中测试:
| |
支持的令牌
使用以下标记进行解析和格式化。 请注意,它们与strptime的令牌不同:
| Token令牌 | Output输出 | |
|---|---|---|
| Year年 | YYYY | 2000, 2001, 2002 … 2012, 2013 |
| YY | 00, 01, 02 … 12, 13 | |
| Month月 | MMMM | January, February, March … 1 |
| MMM | Jan, Feb, Mar … 1 | |
| 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 … 364, 365 | |
| 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 … 2 |
| ddd | Mon, Tue, Wed … 2 | |
| d | 1, 2, 3 … 6, 7 | |
| ISO week date | W | 2011-W05-4, 2019-W17 |
| 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, am, pm 1 |
| a | am, pm 1 | |
| 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 | S… | 0, 02, 003, 000006, 123123123123… 3 |
| Timezone时区 | ZZZ | Asia/Baku, Europe/Warsaw, GMT … 4 |
| ZZ | -07:00, -06:00 … +06:00, +07:00, +08, Z | |
| Z | -0700, -0600 … +0600, +0700, +08, Z | |
| Seconds Timestamp秒时间戳 | X | 1381685817, 1381685817.915482 … 5 |
| ms or µs Timestamp毫秒与微秒时间戳 | x | 1569980330813, 1569980330813221 |
Footnotes脚注说明:
- 1(1,2,3,4) localization support for parsing and formatting
- 2(1,2) localization support only for formatting
- 3 the result is truncated to microseconds, with half-to-even rounding.
- 4 timezone names from tz database provided via dateutil package
- 5 this token cannot be used for parsing timestamps out of natural language strings due to compatibility reasons
内置格式化
有几种格式标准作为内置令牌提供。看下面的示例。
可以通过以下方式查看arrow的版本信息:
| |
注意,内置格式化是在0.15.7版本引入的,如果你的arrow版本相对较低的话,可以使用以下命令升级arrow版本:
| |
可以在这里看到提交修改信息,定义的几个内置格式化常量为:
| |
我们来试一下,这些内置的格式化输出。
| |
我们可以选择一种自己看得顺眼的格式作为自己使用的格式化输出。
格式转义Escaping Format
在解析和格式化时,可以将格式字符串中的标记,短语和正则表达式转义,方法是将它们括在方括号[]内。
解析或格式化
任何令牌或者格式化字符可以像下面这种方式进行转义。
| |
这对于解析不同语言环境(例如法语)中的日期很有用,在这种语言中,通常将时间字符串的格式设置为“8 h 40”而不是“ 8:40”。
正则表达式转义
您也可以通过将正则表达式括在方括号中来对它们进行转义。在以下示例中,我们使用正则表达式\s+来匹配任意数量的空白字符。如果您不能提前知道令牌之间的空格数(例如在日志文件中),这将很有用。
| |
标点符号转义
日期格式可能在下面的列表中的任何一个标点符号两侧, . ; : ? ! " ' [ ] { } ( ) < >
| |
Arrow模块的API
官方文档中提供了详细的api文档,具体可参考https://arrow.readthedocs.io/en/stable/#api-guide。
在github上面可以看到该模块最近也有更新,说明比较活跃!通过本文中的一些示例可以看到,使用arrow模块处理日期时间相关的操作非常的方法,后续可以使用这个模块作为代码中日期的默认的处理方式!
参考:
