鸿蒙 PC使用ohos-pip-autosign激活自动签名工具,安装第三方库arrow实现Python人性化时间处理库
·
欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/
欢迎在PC社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper
AtomGit 仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_python_numpy
1. 环境搭建:
本文介绍在鸿蒙 PC+CodeArts IDE 搭建 Python 开发环境。借助鸿蒙专属包管理器 Harmonybrew 安装适配版 Python,搭配 ohos-pip-autosign 自动签名工具,解决系统对动态库的签名限制。通过虚拟环境隔离依赖,以 NumPy 完成安装与脚本测试,成功解决权限报错,搭建出可用的 Python 开发环境。
可以参考以下文章OpenHarmony 鸿蒙 PC + CodeArts IDE 实现 Python开发完整开发环境搭建指南
Python Arrow 库完整详解 + 全套实战 Demo
一、Arrow 是什么
arrow 是 Python 第三方人性化时间处理库,对原生 datetime、time、calendar 做了高度封装,解决原生日期 API 繁琐、时区处理麻烦、格式化代码冗长的痛点。
原生 datetime 痛点:
- 格式化、时间差、时区转换代码量大
- 时间加减、上月/下周/季度获取逻辑复杂
- 解析各种不规则日期字符串非常麻烦
- 时区操作容易出错
Arrow 核心优势:
- 链式调用,一行代码搞定时间操作
- 内置大量人性化时间语义:
shift(months=-1)上月、ceil('day')当天结束 - 自动兼容各种日期字符串解析
- 完善时区、时间戳、本地时间/UTC互转
- 人性化相对时间输出:
2小时前、3天内 - 支持格式化、截取、区间、季度、周操作
二、安装
pip3 install arrow

三、核心基础API总览
import arrow
# 1. 获取当前时间(本地/UTC)
arrow.now() # 本地当前时间
arrow.utcnow() # UTC标准时间
# 2. 构造指定时间
arrow.Arrow(2026, 6, 17, 12, 30)
arrow.get("2026-06-17 15:20:10")
# 3. 时间戳互转
arrow.get(1781712000) # 秒级时间戳
arrow.get(1781712000000) # 毫秒时间戳
# 4. 格式化输出
t.format("YYYY-MM-DD HH:mm:ss")
# 5. 时间偏移(加减)
t.shift(days=1) # 加1天
t.shift(months=-1) # 减1个月
# 6. 取边界
t.floor('day') # 当天0点
t.ceil('hour') # 当前小时最后一秒
# 7. 相对时间
t.humanize(locale='zh-cn') # 中文:3小时前
完整可运行 Demo(分场景)
Demo1:获取当前时间、格式化、时间戳转换
import arrow
# 1. 当前本地时间
now = arrow.now()
print("本地完整时间对象:", now)
print("当前年月日时分秒:", now.format("YYYY-MM-DD HH:mm:ss"))
print("当前日期:", now.format("YYYY-MM-DD"))
print("当前时间:", now.format("HH:mm:ss"))
print("当前年份季度:", now.format("YYYY-Q"))
# 2. UTC 零时区时间
utc_now = arrow.utcnow()
print("\nUTC时间:", utc_now.format("YYYY-MM-DD HH:mm:ss"))
# 3. 转秒级时间戳
ts_sec = now.timestamp()
print("秒级时间戳:", ts_sec)
# 毫秒时间戳
ts_ms = int(now.timestamp() * 1000)
print("毫秒时间戳:", ts_ms)
# 4. 时间戳还原时间对象
t1 = arrow.get(ts_sec)
t2 = arrow.get(ts_ms / 1000)
print("\n时间戳还原:", t1.format("YYYY-MM-DD HH:mm:ss"))
# 5. 自定义格式化模板
print("年月中文:", now.format("YYYY年MM月DD日 HH点mm分"))

Demo2:解析任意格式日期字符串(最强功能)
无需写复杂匹配模板,自动识别各种日期文本
import arrow
# 各种不规则字符串自动解析
time_str_list = [
"2026-06-17",
"2026/06/17 14:30",
"20260617152010",
"17 Jun 2026",
"2026-06-17T12:30:00+08:00",
"2026年06月17日 16点20分"
]
for s in time_str_list:
t = arrow.get(s)
print(f"原字符串:{s:<30} → 标准格式:{t.format('YYYY-MM-DD HH:mm:ss')}")
# 指定格式解析(严格匹配)
t = arrow.get("17|06|2026", "DD|MM|YYYY")
print("\n自定义分隔符解析:", t.format("YYYY-MM-DD"))
Demo3:时间偏移(加减天/月/年/小时)
import arrow
now = arrow.now()
print("现在:", now.format("YYYY-MM-DD HH:mm:ss"))
# 加1天
t1 = now.shift(days=1)
print("明天:", t1.format("YYYY-MM-DD"))
# 减3天
t2 = now.shift(days=-3)
print("3天前:", t2.format("YYYY-MM-DD"))
# 上个月、下个月
last_month = now.shift(months=-1)
next_month = now.shift(months=1)
print("上月:", last_month.format("YYYY-MM"))
print("下月:", next_month.format("YYYY-MM"))
# 去年、明年
last_year = now.shift(years=-1)
print("去年今日:", last_year.format("YYYY-MM-DD"))
# 小时、分钟、秒偏移
add_2h = now.shift(hours=2)
sub_30m = now.shift(minutes=-30)
print("2小时后:", add_2h.format("HH:mm"))
print("30分钟前:", sub_30m.format("HH:mm"))
# 周偏移
next_week = now.shift(weeks=1)
print("下周今天:", next_week.format("YYYY-MM-DD"))

Demo4:取区间边界(当天0点、当月首尾、季度)
import arrow
now = arrow.now()
# 当天零点 / 当天23:59:59
day_start = now.floor("day")
day_end = now.ceil("day")
print("今日0点:", day_start.format("YYYY-MM-DD HH:mm:ss"))
print("今日结束:", day_end.format("YYYY-MM-DD HH:mm:ss"))
# 当月第一天、当月最后一天
month_start = now.floor("month")
month_end = now.ceil("month")
print("\n本月第一天:", month_start.format("YYYY-MM-DD"))
print("本月最后一天:", month_end.format("YYYY-MM-DD"))
# 季度首尾
quarter_start = now.floor("quarter")
quarter_end = now.ceil("quarter")
print("\n本季度起始:", quarter_start.format("YYYY-MM-DD"))
print("本季度结束:", quarter_end.format("YYYY-MM-DD"))
# 当年起始
year_start = now.floor("year")
print("今年第一天:", year_start.format("YYYY-MM-DD"))
Demo5:人性化相对时间(中文:几分钟前/几天内)
报表、日志、消息列表最常用
import arrow
# 构造几个时间点
t1 = arrow.now().shift(minutes=-5)
t2 = arrow.now().shift(hours=-3)
t3 = arrow.now().shift(days=-2)
t4 = arrow.now().shift(weeks=-1)
t5 = arrow.now().shift(months=-2)
# locale='zh-cn' 输出中文
print("5分钟前:", t1.humanize(locale="zh-cn"))
print("3小时前:", t2.humanize(locale="zh-cn"))
print("2天前:", t3.humanize(locale="zh-cn"))
print("1周前:", t4.humanize(locale="zh-cn"))
print("2个月前:", t5.humanize(locale="zh-cn"))
# 未来时间
future = arrow.now().shift(days=3)
print("3天后:", future.humanize(locale="zh-cn"))
Demo6:时间比较、区间判断、计算时间差
import arrow
t1 = arrow.get("2026-01-01")
t2 = arrow.get("2026-06-17")
now = arrow.now()
# 大小比较
print("t1 < t2:", t1 < t2)
print("t2 > t1:", t2 > t1)
print("相等:", t1 == t2)
# 判断是否在区间内
start = arrow.get("2026-01-01")
end = arrow.get("2026-12-31")
print("now 在2026区间:", start <= now <= end)
# 计算相差天数、小时、秒
diff_days = (t2 - t1).days
diff_seconds = (t2 - t1).total_seconds()
print(f"\nt1到t2相差天数:{diff_days}")
print(f"相差总秒数:{diff_seconds}")
# 精确差值
delta = t2 - t1
print("差值对象天:", delta.days)
print("差值总秒:", delta.total_seconds())
Demo7:时区转换(UTC ↔ 北京时间Asia/Shanghai)
处理接口UTC时间、国际时间必备
import arrow
# UTC时间转北京时间
utc_t = arrow.utcnow()
cn_t = utc_t.to("Asia/Shanghai")
print("UTC时间:", utc_t.format("YYYY-MM-DD HH:mm:ss"))
print("北京时间:", cn_t.format("YYYY-MM-DD HH:mm:ss"))
# 本地时间转UTC
local = arrow.now("Asia/Shanghai")
back_utc = local.to("UTC")
print("\n本地转UTC:", back_utc.format("YYYY-MM-DD HH:mm:ss"))
# 指定时区构造时间
ny_t = arrow.now("America/New_York")
print("纽约当前时间:", ny_t.format("YYYY-MM-DD HH:mm:ss"))
Demo8:常用业务工具封装(可直接复制到项目)
import arrow
class ArrowTimeUtil:
@staticmethod
def get_now_str(fmt="YYYY-MM-DD HH:mm:ss"):
"""获取当前格式化字符串"""
return arrow.now().format(fmt)
@staticmethod
def get_ts_ms():
"""获取毫秒时间戳"""
return int(arrow.now().timestamp() * 1000)
@staticmethod
def str_to_time(date_str, fmt="YYYY-MM-DD HH:mm:ss"):
"""日期字符串转Arrow对象"""
return arrow.get(date_str, fmt)
@staticmethod
def get_day_range(offset=0):
"""获取某天的起止时间 offset=0今天 -1昨天 1明天"""
target = arrow.now().shift(days=offset)
start = target.floor("day")
end = target.ceil("day")
return start.format(), end.format()
@staticmethod
def get_month_range(offset=0):
"""获取某月起止 offset=0本月 -1上月"""
target = arrow.now().shift(months=offset)
start = target.floor("month")
end = target.ceil("month")
return start.format("YYYY-MM-DD"), end.format("YYYY-MM-DD")
@staticmethod
def human_cn(time_obj):
"""输出中文相对时间"""
return time_obj.humanize(locale="zh-cn")
if __name__ == "__main__":
util = ArrowTimeUtil()
print("当前时间:", util.get_now_str())
print("毫秒时间戳:", util.get_ts_ms())
print("今日区间:", util.get_day_range(0))
print("上月区间:", util.get_month_range(-1))
t = arrow.now().shift(hours=-2)
print("相对时间:", util.human_cn(t))

四、典型业务使用场景
- 接口日志打印:自动格式化、毫秒时间戳
- 筛选时间区间:查询今日、昨日、本月、上月数据
- 前端传参解析:自动识别各种不规则日期字符串
- 消息创建时间展示:
5分钟前、3天前人性化显示 - 跨时区项目:UTC时间与本地时区互转
- 定时任务:快速计算N天/月前后执行时间
- 报表统计:季度、月度、年度时间边界快速获取
五、对比原生 datetime 优势示例
原生写法(繁琐)
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
now = datetime.now()
# 取上月
last_month = now - relativedelta(months=1)
print(last_month.strftime("%Y-%m"))
Arrow一行搞定
import arrow
print(arrow.now().shift(months=-1).format("YYYY-MM"))
六、注意事项
- 解析模糊日期字符串时,如果格式混乱,建议传入第二个参数指定模板严格解析,避免歧义;
humanize中文需传入locale="zh-cn",默认英文;- 时区名称标准写法:
Asia/Shanghai,不要写GMT+8; - 时间差相减返回
timedelta对象,用.days取天数、.total_seconds()取总秒; - 存储数据库推荐格式化
YYYY-MM-DD HH:mm:ss或毫秒时间戳,可读性高。
更多推荐



所有评论(0)