【摸鱼笔记】掌握 Arrow,轻松处理时间类型

背景

在 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
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Singing_Towers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值