Arrow 是一个强大的 Python 库,专门设计用于简化日期和时间处理。它提供了比 Python 标准库 datetime
更直观、更人性化的 API,让时间操作变得简单而优雅。
Python 自带的 datetime
模块虽然功能强大,但在实际使用中常常显得笨重:
Arrow 解决了所有这些问题,让时间处理变得简单、高效且不易出错。
特性 | 描述 | 示例 |
---|---|---|
简洁API | 链式调用,代码更简洁 | arrow.now().shift(days=1).to('US/Pacific') |
自动时区 | 默认时区感知,避免常见错误 | arrow.now() 自动获取系统时区 |
人性化时间 | 自然语言时间表示 | arrow.now().humanize() → “几秒前” |
强大解析器 | 智能解析各种时间格式 | arrow.get('2023-06-15 2:30 PM') |
时间范围处理 | 轻松处理时间区间 | arrow.span_range('hour', start, end) |
pip install arrow
import arrow
# 获取当前时间(带时区)
now = arrow.now()
print(f"当前时间: {now}") # 2023-07-20T14:30:45.123456+08:00
# 创建特定时间
birthday = arrow.get(1990, 5, 15, 14, 30) # 年月日时分
print(f"生日: {birthday}")
# 从字符串解析(自动识别格式)
meeting_time = arrow.get("2023-08-15 14:30:00")
print(f"会议时间: {meeting_time}")
# 从时间戳创建
timestamp = 1689840000 # Unix时间戳
launch_time = arrow.get(timestamp)
print(f"发布时间: {launch_time}")
# 格式化为字符串
print(now.format("YYYY年MM月DD日 HH:mm:ss")) # 2023年07月20日 14:30:45
# 转换为datetime对象
dt = now.datetime
print(type(dt)) #
# 转换为时间戳
print(now.timestamp()) # 1689841845.123456
# 人性化时间显示
print(now.humanize()) # 几秒前
print(now.shift(minutes=-15).humanize()) # 15分钟前
# 时间偏移(链式调用)
tomorrow_9am = now.shift(days=1).replace(hour=9, minute=0, second=0)
print(f"明天9点: {tomorrow_9am}")
# 时区转换
utc_time = now.to('UTC')
print(f"UTC时间: {utc_time}")
ny_time = now.to('America/New_York')
print(f"纽约时间: {ny_time}")
# 时间差计算
future = arrow.get(2024, 1, 1)
days_left = (future - now).days
print(f"距离2024年还有 {days_left} 天")
# 获取今天的时间范围
start_of_day = now.floor('day')
end_of_day = now.ceil('day')
print(f"今日开始: {start_of_day}")
print(f"今日结束: {end_of_day}")
# 生成时间区间
start = arrow.get(2023, 1, 1)
end = arrow.get(2023, 1, 5)
# 按天生成范围
for day in arrow.Arrow.range('day', start, end):
print(day.format("MM/DD"))
# 按月生成范围
for month_start, month_end in arrow.Arrow.span_range('month', start, end):
print(f"{month_start.format('YYYY-MM')}: {month_start} 到 {month_end}")
# 获取时间属性
print(f"年: {now.year}, 月: {now.month}, 日: {now.day}")
print(f"时: {now.hour}, 分: {now.minute}, 秒: {now.second}")
print(f"星期: {now.weekday()}") # 0=周一, 6=周日
# 时间比较
if now > tomorrow_9am:
print("已经过了明天9点")
else:
print("还没到明天9点")
# 检查是否为今天
if now.date() == arrow.now().date():
print("这是今天的时间")
# 带本地化的人性化时间
print(now.humanize(locale='zh')) # 中文显示: "几秒前"
print(now.shift(days=-2).humanize(locale='fr')) # 法语: "il y a 2 jours"
# 指定粒度
print(now.shift(hours=3, minutes=15).humanize(
granularity=["hour", "minute"],
locale='zh'
)) # "3小时15分钟内"
def working_days(start_date, end_date, holidays=None):
"""计算两个日期之间的工作日天数"""
if holidays is None:
holidays = []
start = arrow.get(start_date)
end = arrow.get(end_date)
# 确保开始日期在结束日期之前
if start > end:
start, end = end, start
# 初始化计数器
working_days_count = 0
current = start
# 遍历日期范围
while current <= end:
# 检查是否为周末 (周一到周五为工作日)
if current.weekday() < 5:
# 检查是否为节假日
if current.format("YYYY-MM-DD") not in holidays:
working_days_count += 1
current = current.shift(days=1)
return working_days_count
# 使用示例
holidays = ["2023-10-01", "2023-10-02", "2023-10-03"] # 国庆假期
work_days = working_days("2023-10-01", "2023-10-07", holidays)
print(f"2023年国庆假期的工作日天数: {work_days}") # 输出: 0
class BirthdayManager:
def __init__(self):
self.birthdays = {}
def add_birthday(self, name, date):
"""添加生日日期 (格式: YYYY-MM-DD)"""
self.birthdays[name] = arrow.get(date)
def upcoming_birthdays(self, days=30):
"""获取未来指定天数内的生日"""
today = arrow.now()
upcoming = []
for name, bday in self.birthdays.items():
# 计算今年的生日
next_bday = bday.replace(year=today.year)
if next_bday < today:
next_bday = next_bday.shift(years=1)
# 检查是否在指定天数内
days_left = (next_bday - today).days
if 0 <= days_left <= days:
upcoming.append((name, next_bday, days_left))
# 按时间排序
upcoming.sort(key=lambda x: x[1])
return upcoming
def age_on_birthday(self, name):
"""计算下次生日时的年龄"""
bday = self.birthdays.get(name)
if not bday:
return None
today = arrow.now()
next_bday = bday.replace(year=today.year)
if next_bday < today:
next_bday = next_bday.shift(years=1)
return next_bday.year - bday.year
# 使用示例
manager = BirthdayManager()
manager.add_birthday("Alice", "1990-05-15")
manager.add_birthday("Bob", "1985-12-03")
manager.add_birthday("Charlie", "2000-07-22")
print("\n未来30天内的生日:")
for name, date, days_left in manager.upcoming_birthdays():
print(f"{name}: {date.format('MM月DD日')} ({days_left}天后), 将满 {manager.age_on_birthday(name)} 岁")
时区处理原则:
arrow.utcnow()
获取UTC时间高效时间操作:
# 使用链式调用提高可读性
next_monday_9am = (
arrow.now()
.shift(weeks=1)
.replace(hour=9, minute=0, second=0)
.ceil('week') # 下周一开始
)
智能解析时间:
# Arrow可以解析各种格式的时间字符串
arrow.get("2023-06-15") # ISO格式
arrow.get("June 15, 2023") # 自然语言
arrow.get("15/06/23", "DD/MM/YY") # 指定格式
处理时间范围:
# 获取本季度的时间范围
start_of_quarter = now.floor('quarter')
end_of_quarter = now.ceil('quarter')
避免时区陷阱:
# 创建带有时区的时间
aware_time = arrow.get(2023, 6, 15, tzinfo='Asia/Shanghai')
# 不要使用naive时间
naive_time = arrow.get(2023, 6, 15) # 不推荐,缺少时区信息
批量处理时间:
# 使用span_range高效处理时间范围
for start, end in arrow.Arrow.span_range('month', start_date, end_date):
process_month(start, end)
避免频繁创建对象:
# 重用现有对象进行时间操作
base = arrow.now()
times = [base.shift(hours=i) for i in range(24)]
使用时间戳比较:
# 比较时间戳比比较对象更快
if now.timestamp() > deadline.timestamp():
print("已过期")
Arrow 库是 Python 时间处理的现代化解决方案,它解决了标准库 datetime
的诸多痛点:
无论是简单的日期操作还是复杂的时间业务逻辑,Arrow 都能提供优雅、高效的解决方案。它的设计哲学是 “Dates and times made easy”,实际使用中确实让时间处理变得简单直观。
开始使用 Arrow 吧,让你的时间处理代码更加简洁、健壮和可读!
官方文档:Arrow Documentation
GitHub 仓库:arrow
书名 | 出版社 | 推荐 |
---|---|---|
Python编程 从入门到实践 第3版(图灵出品) | 人民邮电出版社 | ★★★★★ |
Python数据科学手册(第2版)(图灵出品) | 人民邮电出版社 | ★★★★★ |
图形引擎开发入门:基于Python语言 | 电子工业出版社 | ★★★★★ |
科研论文配图绘制指南 基于Python(异步图书出品) | 人民邮电出版社 | ★★★★★ |
Effective Python:编写好Python的90个有效方法(第2版 英文版) | 人民邮电出版社 | ★★★★★ |
Python人工智能与机器学习(套装全5册) | 清华大学出版社 | ★★★★★ |
书名 | 出版社 | 推荐 |
---|---|---|
Java核心技术 第12版:卷Ⅰ+卷Ⅱ | 机械工业出版社 | ★★★★★ |
Java核心技术 第11版 套装共2册 | 机械工业出版社 | ★★★★★ |
Java语言程序设计基础篇+进阶篇 原书第12版 套装共2册 | 机械工业出版社 | ★★★★★ |
Java 11官方参考手册(第11版) | 清华大学出版社 | ★★★★★ |
Offer来了:Java面试核心知识点精讲(第2版)(博文视点出品) | 电子工业出版社 | ★★★★★ |