HarmonyOS应用《玄象》开发实战:HeavenlyStems.ets 天干地支数据结构与五行归属
阅读时长约 18 分钟 | 难度★★★★☆ | 篇章第 6 篇 · 命理八字模块对应源码entry/src/main/ets/common/utils/HeavenlyStems.ets前言天干地支是中华传统历法与命理学的基石。玄象项目通过HeavenlyStems.ets工具类封装了天干10 个、地支12 个、生肖12 个的完整数据并提供干支推算、五行归属、生肖查询等核心算法。本篇将深入剖析玄象项目天干地支数据结构的实现从静态常量数组、干支推算算法、五行属性映射到生肖查询与时辰对应。掌握这套天干地支算法您就能为任何 HarmonyOS 应用接入传统历法功能。提示HeavenlyStems.ets是玄象项目最核心的工具类之一被LunarCalendar、MingliAnalysisPage、FortuneTimelinePage等多个模块引用。一、数据常量1.1 天干地支生肖staticreadonlySTEMS:string[][甲,乙,丙,丁,戊,己,庚,辛,壬,癸];staticreadonlyBRANCHES:string[][子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥];staticreadonlySHENGXIAO:string[][鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪];二、干支推算算法2.1 年干支staticgetYearGanZhi(year:number):string{conststemIndex(year-4)%10;constbranchIndex(year-4)%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}三、五行归属3.1 五行映射staticgetFiveElement(stem:string):string{constmap:Recordstring,string{甲:木,乙:木,丙:火,丁:火,戊:土,己:土,庚:金,辛:金,壬:水,癸:水};returnmap[stem]||;}四、生辰查询4.1 时辰推算staticgetShiChen(hour:number):string{constshichenNames[子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥];constindexMath.floor((hour1)/2)%12;returnshichenNames[index];}五、天干地支设计总结5.1 数据流HeavenlyStems.ets ↓ 干支推算 LunarCalendar → 今日干支 ↓ 五行归属 MingliAnalysisPage → 五行分析 ↓ 生肖查询 BaziInputPage → 生肖显示六、天干地支的完整应用示例6.1 年柱推算// 获取 2026 年的年柱constyearGanZhiHeavenlyStems.getYearGanZhi(2026);// 返回 丙午6.2 月柱推算// 获取 2026 年 5 月的月柱constmonthGanZhiHeavenlyStems.getMonthGanZhi(2026,5);// 返回 壬午6.3 日柱推算// 获取 2026 年 5 月 15 日的日柱constdayGanZhiHeavenlyStems.getDayGanZhi(2026,5,15);// 返回 甲子6.4 时柱推算// 获取甲日午时11-13点的时柱consthourGanZhiHeavenlyStems.getHourGanZhi(甲,12);// 返回 庚午七、天干地支在玄象项目中的应用7.1 首页干支显示首页顶部标题栏的丙午年│肖马通过HeavenlyStems工具类计算展示今日干支与生肖信息。7.2 八字排盘BaziInputPage使用HeavenlyStems计算年柱、月柱、日柱、时柱的四柱八字。7.3 五行分析MingliAnalysisPage使用getFiveElement方法分析天干的五行属性计算五行分布。7.4 运势时间线FortuneTimelinePage使用干支推算生成流年运势数据。八、数据模型的设计原则纯函数所有方法都是纯函数相同输入永远产生相同输出无副作用不修改外部状态不依赖 UI 环境可测试性输入输出明确易于单元测试可组合性方法可自由组合构建复杂功能九、单元测试describe(HeavenlyStemsTest,(){it(should return correct stem,0,(){expect(HeavenlyStems.getStem(0)).assertEqual(甲);expect(HeavenlyStems.getStem(9)).assertEqual(癸);});it(should return 2026 as 丙午,0,(){expect(HeavenlyStems.getYearGanZhi(2026)).assertEqual(丙午);});it(should return 2026 as 马,0,(){expect(HeavenlyStems.getShengXiao(2026)).assertEqual(马);});});总结本篇以玄象项目HeavenlyStems.ets为蓝本深入剖析了 ArkTS 天干地支数据结构与算法实现从静态常量数组、干支推算算法、五行属性映射到生肖查询与时辰对应。天干地支是中华传统文化的核心概念在历法、命理、风水等领域有广泛应用。掌握这套天干地支算法您就能为任何 HarmonyOS 应用接入传统历法功能。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源HarmonyOS 官方文档Map 集合HarmonyOS 官方文档Text 组件HarmonyOS 官方文档数组方法HarmonyOS 官方文档ForEach 组件HarmonyOS 官方文档Button 组件HarmonyOS 官方文档Router APIHarmonyOS 官方文档状态管理HarmonyOS 官方文档Grid 组件HarmonyOS 官方文档List 组件HarmonyOS 官方文档Scroll 组件HarmonyOS 官方文档Column 组件HarmonyOS 官方文档Row 组件HarmonyOS 官方文档Stack 组件HarmonyOS 官方文档Text 组件HarmonyOS 官方文档Image 组件HarmonyOS 官方文档Swiper 组件HarmonyOS 官方文档Tabs 组件天干地支wikipedia.org/wiki/天干地支五行wikipedia.org/wiki/五行十二生肖wikipedia.org/wiki/十二生肖开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net十三、算法扩展13.1 月柱计算staticgetMonthGanZhi(year:number,month:number):string{conststemIndex((year-4)*2month)%10;constbranchIndex(month2)%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}13.2 日柱计算staticgetDayGanZhi(year:number,month:number,day:number):string{constdaysthis.getDaysFromBase(year,month,day);conststemIndexdays%10;constbranchIndexdays%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}13.3 时柱计算staticgetHourGanZhi(dayGan:string,hour:number):string{constdayStemIndexHeavenlyStems.STEMS.indexOf(dayGan);conststemIndex(dayStemIndex%5*2Math.floor(hour/2))%10;constbranchIndexMath.floor((hour1)/2)%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}十四、总结HeavenlyStems 工具类是玄象项目中最基础的算法模块为首页、命理、历法等多个功能模块提供干支计算支持。通过纯函数设计和 O(1) 时间复杂度的高效算法保证了干支计算的准确性和性能。在后续开发中可以基于此工具类扩展更多历法相关的功能如五行纳音、神煞推算等。十三、算法扩展13.1 月柱计算staticgetMonthGanZhi(year:number,month:number):string{conststemIndex((year-4)*2month)%10;constbranchIndex(month2)%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}13.2 日柱计算staticgetDayGanZhi(year:number,month:number,day:number):string{constdaysthis.getDaysFromBase(year,month,day);conststemIndexdays%10;constbranchIndexdays%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}13.3 时柱计算staticgetHourGanZhi(dayGan:string,hour:number):string{constdayStemIndexHeavenlyStems.STEMS.indexOf(dayGan);conststemIndex(dayStemIndex%5*2Math.floor(hour/2))%10;constbranchIndexMath.floor((hour1)/2)%12;return${HeavenlyStems.STEMS[stemIndex]}${HeavenlyStems.BRANCHES[branchIndex]};}十四、总结HeavenlyStems 工具类是玄象项目中最基础的算法模块为首页、命理、历法等多个功能模块提供干支计算支持。通过纯函数设计和 O(1) 时间复杂度的高效算法保证了干支计算的准确性和性能。在后续开发中可以基于此工具类扩展更多历法相关的功能如五行纳音、神煞推算等。十五、扩展阅读15.1 相关文章本系列中与天干地支相关的文章第 29 篇 · LunarCalendar.getTodayHeavenlyStems 干支计算在首页的接入第 53 篇 · MingliAnalysisPage 命盘分析四柱排盘 大运流年第 55 篇 · SolarTerms.ets 节气交接时刻计算用于换月定限第 59 篇 · 神煞查法天乙贵人 / 文昌 / 桃花查表算法封装15.2 参考资料《渊海子平》- 宋代徐子平著八字命理学的奠基之作《三命通会》- 明代万民英著命理学经典著作《协纪辨方书》- 清代官修历法书干支运用的权威参考HarmonyOS 官方文档应用开发指南十、天干地支在玄象项目中的完整应用10.1 首页干支显示首页顶部标题栏的丙午年│肖马通过 HeavenlyStems 工具类计算展示今日干支与生肖信息让用户第一时间感知传统文化氛围。10.2 八字排盘BaziInputPage 使用 HeavenlyStems 计算年柱、月柱、日柱、时柱的四柱八字为命理分析提供基础数据。10.3 五行分析MingliAnalysisPage 使用 getFiveElement 方法分析天干的五行属性计算五行分布生成五行力量分析图。10.4 运势时间线FortuneTimelinePage 使用干支推算生成流年运势数据为每个年份赋予干支和生肖信息。十一、算法性能分析11.1 时间复杂度方法时间复杂度说明getStemO(1)直接数组索引getBranchO(1)直接数组索引getYearGanZhiO(1)固定数学运算getShengXiaoO(1)固定数学运算getFiveElementO(1)Map 映射查询11.2 空间复杂度所有方法均为 O(1) 空间复杂度不随输入规模增长而增加内存占用。十二、总结与最佳实践12.1 HeavenlyStems 的核心价值HeavenlyStems 是玄象项目最基础的算法工具类为首页、命理、历法等多个模块提供干支计算支持。其纯函数设计和 O(1) 时间复杂度保证了高效可靠的计算能力。提示HeavenlyStems 工具类的所有方法都是纯函数这意味着相同的输入永远产生相同的输出非常适合在单元测试中验证。12.2 使用建议所有方法都是纯函数适合在任意位置调用计算结果可缓存避免重复计算扩展新方法时保持纯函数特性添加单元测试确保算法准确性总结

相关新闻

Sentinel 与 Hystrix 的对比

Sentinel 与 Hystrix 的对比

核心维度对比 Sentinel(阿里巴巴开源)与 Hystrix(Netflix开源,现已停更)都是微服务架构中用于保障系统高可用与容错的核心组件对比维度SentinelHystrix开源维护状态持续迭代活跃,Spring Cloud Alibaba 核心…

2026/10/9 18:40:35 阅读更多 →
编译colmap

编译colmap

本人菜鸟,在学习三维重建算法,colmap可以将手机拍几张照输入,不用单独做相机标定,即可输出较为密集的点云,效果不错,在此我学习一下colmap源码,只是给自己做个笔记,记录编译的过程&a…

2026/10/10 8:34:02 阅读更多 →
三星手机免Root部署Kali NetHunter:Termux环境下的完整实战指南

三星手机免Root部署Kali NetHunter:Termux环境下的完整实战指南

1. 项目概述:为什么要在手机上部署Kali NetHunter? 几年前,当我第一次听说有人把完整的Kali Linux塞进安卓手机时,我的反应和大多数人一样:这玩意儿能用吗?不是噱头?直到我自己在一台闲置的三星…

2026/10/5 17:42:26 阅读更多 →

最新新闻

人工合规审查有盲区,智能合规如何补足文件风险识别短板

人工合规审查有盲区,智能合规如何补足文件风险识别短板

合同、规章制度、对外函件、合作协议企业日常经营中,海量文本文件里潜藏着大量合规风险。传统人工文件合规审查存在天然短板:依赖个人经验、受精力限制、批量文件极易漏审。许多隐性合规漏洞藏在细碎条款之中,人工难以全覆盖排查。一旦文件落…

2026/10/10 20:50:33 阅读更多 →
同为免费编程搭档:AgnesCode 工作台 vs Cline/Continue 接入流,实测谁更顺?

同为免费编程搭档:AgnesCode 工作台 vs Cline/Continue 接入流,实测谁更顺?

同为免费编程搭档:AgnesCode 工作台 vs Cline/Continue 接入流,实测谁更顺? 【免费下载链接】Agnes-3.0-Flash 项目地址: https://ai.gitcode.com/hf_mirrors/Agnes-AI/Agnes-3.0-Flash 当 Agnes AI 打出"全模态 API 无限期免费…

2026/10/10 20:50:33 阅读更多 →
vue-table搭配Bootstrap样式实战:与Semantic UI完整对照教程

vue-table搭配Bootstrap样式实战:与Semantic UI完整对照教程

【免费下载链接】vue-table data table simplify! -- vuetable is a Vue.js component that will automatically request (JSON) data from the server and display them nicely in html table with swappable/extensible pagination component. 项目地址: https://…

2026/10/10 20:50:33 阅读更多 →
哈工大SSE第33题:5×5矩阵鞍点C语言实现详解

哈工大SSE第33题:5×5矩阵鞍点C语言实现详解

如果你正在刷哈工大 SSE 这套 C 语言编程练习,到第 33 题附近,大概率会撞上一个老熟脸:求 55 矩阵的鞍点。这道题说难不难,说简单也不简单,很多刚学完二维数组的同学会卡在这一题上。作为一个给 SSE 写过代码、也给学弟…

2026/10/10 20:49:33 阅读更多 →
零基础 4 小时学会用 AI 干实际工作:learn-opencode(OpenCode 中文实战课)完整学习路线图

零基础 4 小时学会用 AI 干实际工作:learn-opencode(OpenCode 中文实战课)完整学习路线图

文档教程 【免费下载链接】learn-opencode OpenCode 中文实战课源码与内容仓库:一课一页,覆盖入门到实战工作流。 项目地址: https://gitcode.com/gh_mirrors/le/learn-opencode 点击查看 免费下载 learn-opencode 是一门完全免费、开源的 O…

2026/10/10 20:49:33 阅读更多 →
Wolfram语言编程思维:从表达式到函数式,告别循环陷阱

Wolfram语言编程思维:从表达式到函数式,告别循环陷阱

先说一个我经常在群里看到的现象。很多人学过Python或者C语言之后,转来用Wolfram语言(也就是Mathematica),第一反应往往是:这个语言怎么连循环都写得这么别扭?其实不是Wolfram别扭,而是写这个语…

2026/10/10 20:49:33 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →