Skip to content

Commit 5dff214

Browse files
committed
v1.1.8 新增灶马头;修复月九星计算错误的问题;修复九星错别字;修复宜忌错别字。
1 parent ba73e54 commit 5dff214

File tree

10 files changed

+244
-20
lines changed

10 files changed

+244
-20
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,9 @@
5959
## [1.1.7] - 2025-01-15
6060
1. 修复:农历季节报错的问题。
6161
2. 优化:增强兼容性。
62+
63+
## [1.1.8] - 2025-02-16
64+
1. 新增:灶马头 KitchenGodSteed。
65+
2. 修复:月九星计算错误的问题。
66+
3. 修复:九星错别字。
67+
4. 修复:宜忌错别字。

src/LoopTyme.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,15 @@ protected function nextIndex(int $n): int
101101
return $this->indexOf($this->index + $n);
102102
}
103103

104+
/**
105+
* 到目标索引的步数
106+
*
107+
* @param int $targetIndex 目标索引
108+
* @return int 步数
109+
*/
110+
function stepsTo(int $targetIndex): int
111+
{
112+
return $this->indexOf($targetIndex - $this->index);
113+
}
114+
104115
}

src/culture/KitchenGodSteed.php

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
<?php
2+
3+
namespace com\tyme\culture;
4+
5+
use com\tyme\AbstractCulture;
6+
use com\tyme\lunar\LunarDay;
7+
use com\tyme\sixtycycle\SixtyCycle;
8+
9+
/**
10+
* 灶马头
11+
* @author 6tail
12+
* @package com\tyme\culture
13+
*/
14+
class KitchenGodSteed extends AbstractCulture
15+
{
16+
static array $NUMBERS = ["", "", "", "", "", "", "", "", "", "", "十一", "十二"];
17+
18+
/**
19+
* 正月初一的干支
20+
* @var SixtyCycle
21+
*/
22+
protected SixtyCycle $firstDaySixtyCycle;
23+
24+
function __construct(int $lunarYear)
25+
{
26+
$this->firstDaySixtyCycle = LunarDay::fromYmd($lunarYear, 1, 1)->getSixtyCycle();
27+
}
28+
29+
static function fromLunarYear(int $lunarYear): KitchenGodSteed
30+
{
31+
return new self($lunarYear);
32+
}
33+
34+
protected function byHeavenStem(int $n): string
35+
{
36+
return self::$NUMBERS[$this->firstDaySixtyCycle->getHeavenStem()->stepsTo($n)];
37+
}
38+
39+
protected function byEarthBranch(int $n): string
40+
{
41+
return self::$NUMBERS[$this->firstDaySixtyCycle->getEarthBranch()->stepsTo($n)];
42+
}
43+
44+
/**
45+
* 几鼠偷粮
46+
*
47+
* @return string 几鼠偷粮
48+
*/
49+
function getMouse(): string
50+
{
51+
return sprintf("%s鼠偷粮", $this->byEarthBranch(0));
52+
}
53+
54+
/**
55+
* 草子几分
56+
*
57+
* @return string 草子几分
58+
*/
59+
function getGrass(): string
60+
{
61+
return sprintf("草子%s分", $this->byEarthBranch(0));
62+
}
63+
64+
/**
65+
* 几牛耕田(正月第一个丑日是初几,就是几牛耕田)
66+
*
67+
* @return string 几牛耕田
68+
*/
69+
function getCattle(): string
70+
{
71+
return sprintf("%s牛耕田", $this->byEarthBranch(1));
72+
}
73+
74+
/**
75+
* 花收几分
76+
*
77+
* @return string 花收几分
78+
*/
79+
function getFlower(): string
80+
{
81+
return sprintf("花收%s分", $this->byEarthBranch(3));
82+
}
83+
84+
/**
85+
* 几龙治水(正月第一个辰日是初几,就是几龙治水)
86+
*
87+
* @return string 几龙治水
88+
*/
89+
function getDragon(): string
90+
{
91+
return sprintf("%s龙治水", $this->byEarthBranch(4));
92+
}
93+
94+
/**
95+
* 几马驮谷
96+
*
97+
* @return string 几马驮谷
98+
*/
99+
function getHorse(): string
100+
{
101+
return sprintf("%s马驮谷", $this->byEarthBranch(6));
102+
}
103+
104+
/**
105+
* 几鸡抢米
106+
*
107+
* @return string 几鸡抢米
108+
*/
109+
function getChicken(): string
110+
{
111+
return sprintf("%s鸡抢米", $this->byEarthBranch(9));
112+
}
113+
114+
/**
115+
* 几姑看蚕
116+
*
117+
* @return string 几姑看蚕
118+
*/
119+
function getSilkworm(): string
120+
{
121+
return sprintf("%s姑看蚕", $this->byEarthBranch(9));
122+
}
123+
124+
/**
125+
* 几屠共猪
126+
*
127+
* @return string 几屠共猪
128+
*/
129+
function getPig(): string
130+
{
131+
return sprintf("%s屠共猪", $this->byEarthBranch(11));
132+
}
133+
134+
/**
135+
* 甲田几分
136+
*
137+
* @return string 甲田几分
138+
*/
139+
function getField(): string
140+
{
141+
return sprintf("甲田%s分", $this->byHeavenStem(0));
142+
}
143+
144+
/**
145+
* 几人分饼(正月第一个丙日是初几,就是几人分饼)
146+
*
147+
* @return string 几人分饼
148+
*/
149+
function getCake(): string
150+
{
151+
return sprintf("%s人分饼", $this->byHeavenStem(2));
152+
}
153+
154+
/**
155+
* 几日得金(正月第一个辛日是初几,就是几日得金)
156+
*
157+
* @return string 几日得金
158+
*/
159+
function getGold(): string
160+
{
161+
return sprintf("%s日得金", $this->byHeavenStem(7));
162+
}
163+
164+
/**
165+
* 几人几丙
166+
*
167+
* @return string 几人几丙
168+
*/
169+
function getPeopleCakes(): string
170+
{
171+
return sprintf("%s人%s丙", $this->byEarthBranch(2), $this->byHeavenStem(2));
172+
}
173+
174+
/**
175+
* 几人几锄
176+
*
177+
* @return string 几人几锄
178+
*/
179+
function getPeopleHoes(): string
180+
{
181+
return sprintf("%s人%s锄", $this->byEarthBranch(2), $this->byHeavenStem(3));
182+
}
183+
184+
function getName(): string
185+
{
186+
return "灶马头";
187+
}
188+
}

src/culture/Taboo.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
class Taboo extends LoopTyme
1515
{
16-
static array $NAMES = ['祭祀', '祈福', '求嗣', '开光', '塑绘', '齐醮', '斋醮', '沐浴', '酬神', '造庙', '祀灶', '焚香', '谢土', '出火', '雕刻', '嫁娶', '订婚', '纳采', '问名', '纳婿', '归宁', '安床', '合帐', '冠笄', '订盟', '进人口', '裁衣', '挽面', '开容', '修坟', '启钻', '破土', '安葬', '立碑', '成服', '除服', '开生坟', '合寿木', '入殓', '移柩', '普渡', '入宅', '安香', '安门', '修造', '起基', '动土', '上梁', '竖柱', '开井开池', '作陂放水', '拆卸', '破屋', '坏垣', '补垣', '伐木做梁', '作灶', '解除', '开柱眼', '穿屏扇架', '盖屋合脊', '开厕', '造仓', '塞穴', '平治道涂', '造桥', '作厕', '筑堤', '开池', '伐木', '开渠', '掘井', '扫舍', '放水', '造屋', '合脊', '造畜稠', '修门', '定磉', '作梁', '修饰垣墙', '架马', '开市', '挂匾', '纳财', '求财', '开仓', '买车', '置产', '雇庸', '出货财', '安机械', '造车器', '经络', '酝酿', '作染', '鼓铸', '造船', '割蜜', '栽种', '取渔', '结网', '牧养', '安碓磑', '习艺', '入学', '理发', '探病', '见贵', '乘船', '渡水', '针灸', '出行', '移徙', '分居', '剃头', '整手足甲', '纳畜', '捕捉', '畋猎', '教牛马', '会亲友', '赴任', '求医', '治病', '词讼', '起基动土', '破屋坏垣', '盖屋', '造仓库', '立券交易', '交易', '立券', '安机', '会友', '求医疗病', '诸事不宜', '馀事勿取', '行丧', '断蚁', '归岫'];
16+
static array $NAMES = ['祭祀', '祈福', '求嗣', '开光', '塑绘', '齐醮', '斋醮', '沐浴', '酬神', '造庙', '祀灶', '焚香', '谢土', '出火', '雕刻', '嫁娶', '订婚', '纳采', '问名', '纳婿', '归宁', '安床', '合帐', '冠笄', '订盟', '进人口', '裁衣', '挽面', '开容', '修坟', '启钻', '破土', '安葬', '立碑', '成服', '除服', '开生坟', '合寿木', '入殓', '移柩', '普渡', '入宅', '安香', '安门', '修造', '起基', '动土', '上梁', '竖柱', '开井开池', '作陂放水', '拆卸', '破屋', '坏垣', '补垣', '伐木做梁', '作灶', '解除', '开柱眼', '穿屏扇架', '盖屋合脊', '开厕', '造仓', '塞穴', '平治道涂', '造桥', '作厕', '筑堤', '开池', '伐木', '开渠', '掘井', '扫舍', '放水', '造屋', '合脊', '造畜稠', '修门', '定磉', '作梁', '修饰垣墙', '架马', '开市', '挂匾', '纳财', '求财', '开仓', '买车', '置产', '雇佣', '出货财', '安机械', '造车器', '经络', '酝酿', '作染', '鼓铸', '造船', '割蜜', '栽种', '取渔', '结网', '牧养', '安碓磑', '习艺', '入学', '理发', '探病', '见贵', '乘船', '渡水', '针灸', '出行', '移徙', '分居', '剃头', '整手足甲', '纳畜', '捕捉', '畋猎', '教牛马', '会亲友', '赴任', '求医', '治病', '词讼', '起基动土', '破屋坏垣', '盖屋', '造仓库', '立券交易', '交易', '立券', '安机', '会友', '求医疗病', '诸事不宜', '馀事勿取', '行丧', '断蚁', '归岫'];
1717

1818
/**
1919
* @var string[] 每日宜忌数据

src/culture/star/nine/NineStar.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ function next(int $n): static
4747
*/
4848
function getColor(): string
4949
{
50-
return ['', '', '', '绿', '', '', '', '', ''][$this->index];
50+
return ['', '', '', '绿', '', '', '', '', ''][$this->index];
5151
}
5252

5353
/**

src/lunar/LunarMonth.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,11 @@ function getSixtyCycle(): SixtyCycle
345345
*/
346346
function getNineStar(): NineStar
347347
{
348-
return NineStar::fromIndex(27 - $this->year->getSixtyCycle()->getEarthBranch()->getIndex() % 3 * 3 - $this->getSixtyCycle()->getEarthBranch()->getIndex());
348+
$index = $this->getSixtyCycle()->getEarthBranch()->getIndex();
349+
if ($index < 2) {
350+
$index += 3;
351+
}
352+
return NineStar::fromIndex(27 - $this->year->getSixtyCycle()->getEarthBranch()->getIndex() % 3 * 3 - $index);
349353
}
350354

351355
/**

src/lunar/LunarYear.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
use com\tyme\AbstractTyme;
77
use com\tyme\culture\Direction;
8+
use com\tyme\culture\KitchenGodSteed;
89
use com\tyme\culture\star\nine\NineStar;
910
use com\tyme\culture\Twenty;
1011
use com\tyme\sixtycycle\SixtyCycle;
@@ -192,4 +193,14 @@ function getMonths(): array
192193
}
193194
return $l;
194195
}
196+
197+
/**
198+
* 灶马头
199+
*
200+
* @return KitchenGodSteed 灶马头
201+
*/
202+
function getKitchenGodSteed(): KitchenGodSteed
203+
{
204+
return KitchenGodSteed::fromLunarYear($this->year);
205+
}
195206
}

src/solar/SolarDay.php

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -270,16 +270,12 @@ function getPhenologyDay(): PhenologyDay
270270
*/
271271
function getDogDay(): ?DogDay
272272
{
273+
// 夏至
273274
$xiaZhi = SolarTerm::fromIndex($this->getYear(), 12);
274275
// 第1个庚日
275276
$start = $xiaZhi->getJulianDay()->getSolarDay();
276-
$add = 6 - $start->getLunarDay()->getSixtyCycle()->getHeavenStem()->getIndex();
277-
if ($add < 0) {
278-
$add += 10;
279-
}
280277
// 第3个庚日,即初伏第1天
281-
$add += 20;
282-
$start = $start->next($add);
278+
$start = $start->next($start->getLunarDay()->getSixtyCycle()->getHeavenStem()->stepsTo(6) + 20);
283279
$days = $this->subtract($start);
284280
// 初伏以前
285281
if ($days < 0) {
@@ -376,22 +372,14 @@ function getPlumRainDay(): ?PlumRainDay
376372
// 芒种
377373
$grainInEar = SolarTerm::fromIndex($this->getYear(), 11);
378374
$start = $grainInEar->getJulianDay()->getSolarDay();
379-
$add = 2 - $start->getLunarDay()->getSixtyCycle()->getHeavenStem()->getIndex();
380-
if ($add < 0) {
381-
$add += 10;
382-
}
383375
// 芒种后的第1个丙日
384-
$start = $start->next($add);
376+
$start = $start->next($start->getLunarDay()->getSixtyCycle()->getHeavenStem()->stepsTo(2));
385377

386378
// 小暑
387379
$slightHeat = $grainInEar->next(2);
388380
$end = $slightHeat->getJulianDay()->getSolarDay();
389-
$add = 7 - $end->getLunarDay()->getSixtyCycle()->getEarthBranch()->getIndex();
390-
if ($add < 0) {
391-
$add += 12;
392-
}
393381
// 小暑后的第1个未日
394-
$end = $end->next($add);
382+
$end = $end->next($end->getLunarDay()->getSixtyCycle()->getEarthBranch()->stepsTo(7));
395383

396384
if ($this->isBefore($start) || $this->isAfter($end)) {
397385
return null;

test/KitchenGodSteedTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
use com\tyme\culture\KitchenGodSteed;
4+
use PHPUnit\Framework\TestCase;
5+
6+
/**
7+
* 灶马头测试
8+
* @author 6tail
9+
*/
10+
class KitchenGodSteedTest extends TestCase
11+
{
12+
function test0()
13+
{
14+
$this->assertEquals('二龙治水', KitchenGodSteed::fromLunarYear(2017)->getDragon());
15+
}
16+
}

test/NineStarTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function test4()
5151
function test5()
5252
{
5353
$nineStar = LunarMonth::fromYm(2022, 1)->getNineStar();
54-
$this->assertEquals('二黒土', $nineStar->__toString());
54+
$this->assertEquals('二黑土', $nineStar->__toString());
5555
$this->assertEquals('天璇', $nineStar->getDipper()->__toString());
5656
}
5757

0 commit comments

Comments
 (0)