欢迎加入开源鸿蒙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 第三方人性化时间处理库,对原生 datetimetimecalendar 做了高度封装,解决原生日期 API 繁琐、时区处理麻烦、格式化代码冗长的痛点。
原生 datetime 痛点:

  1. 格式化、时间差、时区转换代码量大
  2. 时间加减、上月/下周/季度获取逻辑复杂
  3. 解析各种不规则日期字符串非常麻烦
  4. 时区操作容易出错

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))

请添加图片描述

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

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐