背景
在 python 开发过程中,一般使用 datetime 处理日期类型数据;
datetime 库虽然功能强大,但使用起来相对繁琐,特别是在格式化输出、时间偏移等方面;
比如 datetime 库 使用datetime.timedelta
无法简单处理偏移月或者年,需要额外计算,
而 Arrow 只需使用arrow.shift(months=1)
直接得到结果;
总之,Arrow 提供了相对于其他库一种更简洁、更人性化的方式来处理这些问题。
简介
Arrow 是一个用于处理日期和时间的 Python 三方库;
它提供了一种简洁、易用的方式来创建、操作和格式化日期、时间、时间戳等日期相关的对象;
Arrow 的设计初衷是为了解决 Python 中标准日期时间库 datetime 的一些痛点;
它实现并更新 datetime 类型,填补了一部分内置库功能上的空白;
简而言之,它可以支持比内置库更多的方式来处理时间,减小处理时间的难度;
安装
pip install arrow
示例:时间相关的类型转换
获取当前时间
示例
import arrow
# 当前时间
datetime_now = arrow.now()
print(datetime_now, type(datetime_now))
# 当前UTC时间
datetime_utcnow = arrow.utcnow()
print(datetime_utcnow, type(datetime_utcnow))
运行结果
2023-12-24T17:51:17.262039+08:00 <class 'arrow.arrow.Arrow'>
2023-12-24T09:51:17.262039+00:00 <class 'arrow.arrow.Arrow'>
Arrow 对象 转 内置日期类型
示例
import arrow
import datetime as dt
# arrow.arrow.Arrow 转 内置日期类型
print(type(arrow.now()), type(arrow.now().datetime), type(dt.datetime.now()))
运行结果
<class 'arrow.arrow.Arrow'> <class 'datetime.datetime'> <class 'datetime.datetime'>
获取时间戳
示例
import arrow
# 获取时间戳
# 整型时间戳
int_timestamp_now = arrow.now().int_timestamp
print(int_timestamp_now, type(int_timestamp_now))
# 浮点型时间戳
float_timestamp_now = arrow.now().float_timestamp
print(float_timestamp_now, type(float_timestamp_now))
运行结果
1703411571 <class 'int'>
1703411571.461714 <class 'float'>
时间戳转日期类型
示例
import arrow
# 时间戳转日期类型
# 未指定时区时,默认时区是 +00:00
print(arrow.get(arrow.now().float_timestamp).format('YYYY-MM-DD HH:mm:ss ZZ'))
print(arrow.get(arrow.now().int_timestamp).format('YYYY-MM-DD HH:mm:ss ZZ'))
# 指定时区
print(arrow.get(arrow.now().float_timestamp, tzinfo="+08:00"))
print(arrow.get(arrow.now().int_timestamp, tzinfo="+08:00"))
# 指定当前时区
print(arrow.get(arrow.now().float_timestamp, tzinfo="local"))
print(arrow.get(arrow.now().int_timestamp, tzinfo="local"))
运行结果
2023-12-24 09:53:20 +00:00
2023-12-24 09:53:20 +00:00
2023-12-24T17:53:20.711517+08:00
2023-12-24T17:53:20+08:00
2023-12-24T17:53:20.711517+08:00
2023-12-24T17:53:20+08:00
日期类型转字符串
示例
import arrow
# 默认字符串格式
print(arrow.now().format())
# 指定字符串格式 包括 ZZZ 时区
print(arrow.now().format('YYYY-MM-DD HH:mm:ss ZZZ'))
# 指定字符串格式 不包括时区
print(arrow.now().format('YYYY-MM-DD HH:mm:ss'))
# 指定字符串格式 没有额外的字符
print(arrow.now().format('YYYYMMDD'))
# 指定字符串格式 浮点型时间戳
print(arrow.now().format('X'))
# 指定字符串格式 英文完整月份
print(arrow.now().format('MMMM'))
运行结果
2023-12-24 17:53:53+08:00
2023-12-24 17:53:53 中国标准时间
2023-12-24 17:53:53
20231224
1703411633.343275
December
字符串转日期类型
示例
import arrow
# 字符串转日期类型,指定字符串解析格式
print(arrow.get("2019-10-31", "YYYY-MM-DD"), type(arrow.get("2019-10-31", "YYYY-MM-DD")))
运行结果
2019-10-31T00:00:00+00:00 <class 'arrow.arrow.Arrow'>
示例:时间类型的计算
计算偏移后的时间
示例
import arrow
# 当前时间
now = arrow.now()
# shift() 方法参数单独使用
day_add3 = now.shift(days=3)
print("3天后", "相隔天数", (day_add3 - now).days)
day_sub2 = now.shift(days=-2)
print("2天前", "相隔天数", (now - day_sub2).days)
year_sub1 = now.shift(years=-1)
print("1年前", "相隔天数", (now - year_sub1).days)
month_add2 = now.shift(months=2)
print("2个月后", "相隔天数", (month_add2 - now).days)
# shift() 方法参数同时使用
sec_tmp = now.shift(hours=2, minutes=-1, seconds=-30)
print("2小时后 前移1分钟 再前移30秒", "相隔秒数", (sec_tmp - now).total_seconds())
运行结果
3天后 相隔天数 3
2天前 相隔天数 2
1年前 相隔天数 365
2个月后 相隔天数 62
2小时后 前移1分钟 再前移30秒 相隔秒数 7110.0
获取单位时间的跨度
获取单位时间段内的开头和结尾
示例
import arrow
# 获取当前时间所在小时的开始和结尾
print(arrow.now().span('hour'))
运行结果
(<Arrow [2023-12-24T17:00:00+08:00]>, <Arrow [2023-12-24T17:59:59.999999+08:00]>)
获取单位时间段内的开始和结尾
示例
import arrow
# 获取当前时间所在小时的开始
print(arrow.now().floor('hour'))
# 获取当前时间所在小时的结尾
print(arrow.now().ceil('hour'))
运行结果
2023-12-24T17:00:00+08:00
2023-12-24T17:59:59.999999+08:00