ZodiStem は 東洋暦 十干十二支 (六十干支) 占い。 生年月日 → 立春 (2/4) で年切替 → 1984/02/04 甲子 を起点に (year - 1984) mod 60 で 60 サイクル算出。 ラボ 44 本目、 占い ジャンル 4 本目 (fate-num 西洋数秘 / arcana-flip タロット 中世大陸 / maya-cast マヤ暦 中米古代 / zodi-stem 東洋古代中国、 西洋 / 中世 / 中米 / 東洋 4 文化軸完成)。
#なぜこの形にしたか
無料運営 (¥0 月コスト + PV 巨大) 候補の 7 本目として 「東洋占い」 で 占い軸を完成させる狙い。 既存 3 本は 西洋 (fate-num) / 中世 (arcana-flip) / 中米 (maya-cast) で、 アジア / 東洋がポッカリ空いていた。 占い系最後 maya-cast (32 本目) から 11 本ぶりで ジャンル 多様化にも貢献。 「干支 占い / 十干 / 五行 / 陰陽 五行 / 性格 占い」 は 通年検索需要、 純 JS + 静的データで完結。
#技術スタック
#立春切替 + 60 サイクル
function yearByLichun(year: number, month: number, day: number): number {
if (month < 2 || (month === 2 && day < 4)) return year - 1
return year
}
// 1984-02-04 = 甲子 (cycle 0)
function cycleOf(y: number, m: number, d: number): number {
const adj = yearByLichun(y, m, d)
return ((adj - 1984) % 60 + 60) % 60
}立春 (2/4 0:00 JST 簡略) より前は前年扱い。 例: 2024/01/15 → 2023 扱い → 癸卯 / 2024/02/05 → 2024 扱い → 甲辰。
#60 サイクル → 十干 + 十二支 + 五行 + 陰陽
const cycle = cycleOf(y, m, d)
const stem = STEMS[cycle % 10] // 甲乙丙丁戊己庚辛壬癸
const zodiac = ZODIACS[cycle % 12] // 子丑寅卯辰巳午未申酉戌亥
const element = ELEMENTS[Math.floor(stem / 2)] // 木火土金水
const yinyang = stem % 2 === 0 ? "陽" : "陰"10 × 12 = 120 のうち 偶数 + 偶数 / 奇数 + 奇数 しか組まないため 60 通り (sexagenary cycle = 還暦)。
#12 干支 アーキタイプ + 10 干 ニュアンス
各 干支 (子丑寅卯辰巳午未申酉戌亥) に archetype + essence + strengths + shadows + career + bestWith (相性 2 種) を持たせ、 10 干 (甲乙丙丁戊己庚辛壬癸) に STEM_TONE ニュアンス (「大樹のように」 「太陽のように」 等) を 重ね合せる。 同じ 子 でも 甲子 (大樹のような子) と 戊子 (山のような子) では 性格描写が違う。
#60 サイクル 10×6 グリッド可視化
<div className={styles.cycleGrid}>
{Array.from({ length: 60 }).map((_, i) => (
<div
key={i}
className={i === result.cycle ? styles.cycleCellMine : styles.cycleCell}
>
<span>{STEMS[i % 10]}{ZODIACS[i % 12]}</span>
<span className={styles.cycleCellIdx}>{i + 1}</span>
</div>
))}
</div>自分のセルだけ 朱赤 + 金縁 + 1.4s パルス アニメで強調 (maya-cast Tzolkin 260 グリッドの 60 版)。
#見た目の方針
書道半紙 + 朱印 + 60 干支盤 モチーフ:
- 配色: washi cream
#f6efde+ 墨#1a1410+ 朱印 朱赤#c63224+ 金箔#c89a3a+ 五行 5 色 (木#3a7d4a/ 火#c63224/ 土#a87545/ 金#c89a3a/ 水#2d5a8b) + 半紙縦罫#c8b894+ 大吉 emerald#2d7d5e - モチーフ: 半紙 + 縦罫 (
repeating-linear-gradient 90deg 80px) + 朱印 「占」 banner + 中央 大型 干支文字 (Instrument Serif 128px) + 五行 タグ rotate -3deg + 60 干支 10×6 グリッド + 自分のセル パルス + 4 ファセット border-left カラー (朱赤 / emerald / ink-dim / gold) - typography: Instrument Serif italic (書道見出し + 朱印) + Noto Serif JP weight 700 (干支文字 大型) + JetBrains Mono (干支インデックス / cycle 数) + Space Grotesk 800 (display)
既存 占い 3 本 (fate-num deep indigo zodiac wheel / arcana-flip midnight 中世大聖堂 / maya-cast earth red 古代壁画) と完全別軸。 gift-cap (墨朱 巻物) と方向性近いが モチーフ (税金巻物 vs 書道半紙 60 干支盤) と 構造 (縦長巻物 vs 横長半紙) で別、 唯一の 「書道半紙 + 60 干支盤」 モチーフ。
#6 サンプル
- 1984-02-04 (現代の起点 甲子)
- 2000-01-01 (新世紀)
- 1989-01-08 (昭和最終日 = 立春前なので 昭和 63 年 = 戊辰)
- 2019-05-01 (令和元年 = 己亥)
- 1980-08-15
- 1995-08-15 (戦後 50 年)
#🗓️ 追記 (2026-08-14) — 日柱を実装した
公開後、 検索の実データを見ると 「2000-01-01 干支 日柱 戊辰」 のような、 日付を指定して日柱を求める検索が複数、 しかも掲載順位 7〜9 位で来ていました。 ページは出ているのに、 その質問に答えていない状態です。
当初これを見送ったのは 「検算できる出典を持てない」 という理由でした。 数字を断定して出す機能は、 合っているか確かめられないなら作らない ── という線引きです。 そこで改めて調べ直したところ、 日柱は ユリウス通日を 60 で割った余りだけで決まり、 暦法にも節入りにも影響されないことが分かりました。 年柱と違って解釈の余地がありません。
const cycle = (((julianDayNumber(year, month, day) + 49) % 60) + 60) % 60検算は 独立した 3 つの出典と突き合わせました。
| 日付 | 期待 | 出典 |
|---|---|---|
| 1873-01-12 | 甲子 | 暦のページ |
| 2008-10-05 | 戊寅 | 暦のページ |
| 2008-02-06 | 丙子 | 暦のページ |
| 2000-01-07 | 甲子 | 日干支計算の基準日 |
さらに julianDayNumber(2000,1,1) が天文の標準値 2451545 (J2000.0) と一致することも確認しています。
これらを scripts/check-zodi-stem.ts に固定して、 60 日周期・うるう日・
グレゴリオ暦導入前の日付を弾くかまで自動で確かめるようにしました。
ひとつだけ解釈の分かれる点があり、 日の変わり目です。 このページは 0 時としていますが、 四柱推命の流派によっては 23 時 (子の刻の始まり) から翌日とします。 どちらかを黙って採るのではなく、 画面に明記して 23 時台生まれの人が気づけるようにしました。
「検算できないから作らない」は「永久に作らない」ではありません。 検算できる形が見つかれば作る、 というだけの話でした。 見送った判断そのものは、 今も正しかったと思っています。
#まだやっていないこと
- 月柱 / 時柱 (月柱は 節入りの正確な時刻が要り、 時柱は出生時刻が要る)
- 大運 / 流年 (10 年毎の運勢サイクル)
- 干支相性表 60×60 (12 種 → 60 種に拡大)
- 複数人 相性チェック (2 つの干支 同時表示)
- 節入り 厳密化 (立春時刻 0:00 → 実時刻 2/3 23 時〜2/4 12 時 補正、 国立天文台 暦象年表)
- 異体字 / 旧字対応 (壬 vs 任 等)
[ ./next_action ]
読んだら、 ZodiStem を実際に動かす。
この開発ログは ZodiStem をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。