Sincronario
将公历转换为 13 月亮银河历的自动化转换工具。
现代世界中的时间概念几乎完全由公历(格里高利历)支配,这是一种由十二个不对称且不规则的月份组成的系统。这一结构虽然是全球标准,但缺乏精确的几何或天文学和谐。另一方面,“13月亮同步历”提出了一种替代范式:基于 13 个循环(每期恰好 28 天,共 364 天)的永续历法,外加一个“无时间日”以与太阳年同步。
我在本项目中处理的问题不是哲学的,而是计算上的:如何在保持最佳 Web 性能和通用可访问性的同时,将公历模型的不规则性动态翻译并同步到 13 月亮历模型的确定性与周期性结构中?
该工具的真实实用价值在于将这一复杂的计算自动化。通过输入或检测日期,系统将公历时间坐标映射到静态参考日期(2013年7月26日,Kin 164),并立即计算出相应的 Kin、太阳图腾 (Solar Seal)、银河音阶 (Galactic Tone)、月亮 (Moon)、该月的具体日期以及 径向等离子 (Radial Plasma)。
工作流非常直观:
- 用户访问 Web 应用。
- 系统捕获当前本地日期。
- 业务规则引擎执行转换算法。
- 界面返回一张时间身份卡片 (Kin) 及其在 13 月亮矩阵中的位置。 这使得不了解同步历数学的人能够即时且易懂地获得其时间坐标。
深入架构分析(技术视角)
作为该解决方案的架构师,我优先考虑了交付速度、客户端极小的开销,以及领域逻辑与呈现层之间的清晰分离。
整体架构与设计模式
项目在 Server-Side Rendering (SSR) 范式下构建为轻量级单体应用,使用的是 Astro。
使用 SSR 代替静态站点 (SSG) 的技术决策建立在应用的本质上:主要内容内在依赖于时间 (new Date())。通过在服务端(在这种情况下,是在 Edge 或通过 Vercel 适配器的 Serverless Functions)进行渲染,我确保客户端接收到带有计算好的日期的纯 HTML,消除了因浏览器执行 JavaScript 带来的加载延迟,并改善了 SEO 和 First Contentful Paint (FCP)。
底层的架构模式遵循 职责分离 (Separation of Concerns) 方法:
- 领域/逻辑层 (
src/lib/): 包含纯粹且独立于框架的算法。 - 呈现层 (
src/pages/与src/components/): 专门负责消费领域层并构建标记。
数据建模与业务逻辑
系统的核心是同步逻辑。我将主要实体 DreamspellDate 设计为一旦计算便不可变。没有全局响应式状态管理,因为应用在其当前的主要工作流中,计算并展示时间的静态快照。
规则引擎处理同步历特有的数学边界情况 (edge cases):
- 年度的开始固定在公历 7 月 26 日。
- 7 月 25 日从标准月亮流中抽象出来,被处理为 无时间日 (Day Out of Time)。
- 2月29日(公历闰年日)从常规 kin 计数中隔离出来,在功能上被处理为
0.0 Hunab Ku,从而避免永续历法的错位。
flowchart TD
A[目标公历日期] --> B{是 2 月 29 日吗?}
B -- 是 --> C[返回 Hunab Ku 对象]
B -- 否 --> D{是 7 月 25 日吗?}
D -- 是 --> E[分配无时间日]
D -- 否 --> F[计算自年初以来的天数]
F --> G[计算月亮索引与月之日]
E --> H[计算基础 Kin]
C --> END[计算结束]
G --> H
H --> I[计算自参考日期的偏移量]
I --> J[确定太阳图腾 1-20]
I --> K[确定银河音阶 1-13]
I --> L[确定径向等离子 1-7]
J --> M[构建 DreamspellDate 实体]
K --> M
L --> M
E --> M
M --> END
由此产生的数据实体结构如下:
classDiagram
class DreamspellDate {
+Date gregorianDate
+number kin
+string seal
+number sealIndex
+string tone
+number toneIndex
+string moon
+number moonIndex
+number dayOfMoon
+string plasma
+boolean isDayOutOfTime
+string color
}
技术栈
工具链生态系统严格因其效率、强类型和开发体验而被选择。
| 技术 | 架构角色 | 技术考量 |
|---|---|---|
| Astro | Meta-framework 与渲染 | 提供快速 SSR 并默认发送 Zero-JS。非常适合高度静态或依赖于单次服务端请求的内容。 |
| TypeScript | 静态类型 | 确保领域实体 (DreamspellDate) 的完整性,并在复杂的日期数学运算中预防错误。 |
| Tailwind CSS | 基于实用程序的样式 | 允许直接在组件中进行敏捷设计,而不会膨胀全局 CSS 文件的体积。与 Vite 打包工具协同工作。 |
| Vite PWA | 渐进式 Web 应用配置 | 在 Astro 编译过程中透明地实现离线功能和原生安装能力。 |
| Vercel Adapter | 部署与基础设施 | 方便直接在 Vercel 的 Serverless 基础设施上执行由 Astro 生成的 SSR 函数。 |
Astro SSR 模式、TypeScript 强类型逻辑领域以及解耦界面的结合形成了一个高性能的解决方案。系统抽象了历法转换的算法复杂性,将数学逻辑封装在纯函数中,交付了一个在毫秒内响应且客户端执行开销极小的最终产品。
拖动可移动图示。按 + 和 − 缩放,方向键移动,0 重置视图。
一起合作
软件工程师、高级全栈开发工程师,常驻玻利维亚Santa Cruz,远程办公。欢迎新的工作机会。