Skip to content

Commit a3d355a

Browse files
committed
v1.2.2 修复宜忌错别字;简化代码;优化流年计算逻辑;优化节气推移。
1 parent 27d16be commit a3d355a

File tree

4 files changed

+40
-107
lines changed

4 files changed

+40
-107
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,9 @@
6767
1. 新增:灶马头 KitchenGodSteed。
6868
2. 修复:月九星计算错误的问题。
6969
3. 修复:九星错别字。
70+
71+
## [1.2.2] - 2025-03-01
72+
1. 修复:宜忌错别字。
73+
2. 优化:简化代码。
74+
3. 优化:流年计算逻辑。
75+
4. 优化:优化节气推移。

lib/index.ts

Lines changed: 29 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ export class Sound extends LoopTyme {
571571
}
572572

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

576576
protected static dayTaboo: string[] = [
577577
'8319000776262322200C1E1D,06292C2E1F;0F11185C0001092A0D7014692983847B7C2C2E302F802D2B,06454F208A;111852838470795B302F404533802D152B39201E23221D212726,0F2E1F010D29;004023222089,0F29111847;11180001032A0D70795B2C2E302F802D4E152B33714161201F26,52095847;0F17000102061979454F3A15477677,241F8A20;34357C89,7129;1551000403706A454F3A3D771F262322271E1D21,382B415220;0F000102037039297175261F1D21,454F2E156341;00076A54196348767765,7920297115528A0D382B;11180001020439332C2E302F2B5844477515634C1F2721,0F520D19267A29717020;297170192C2E2D2F2B3E363F4C,0F5215632001034720;4C78,297172380D2A2E0F474841;18115C0001702A2C2E2F5283847129795B6375802D154C,1F208A24;1811795B032C2E302F802D4163754C27261E1D2120,010D0F29521F;00401D232289,71290F4720;0F170001020E032A70692C2E302F802D2B0D7129474C201F2322,5211183809615D;0F1811000102062A0D2C2D804B2B672E2F7129,70471F8A20;0007343589,0F71296B7080;175447440D15838477656A49,2B2E1F8A2022;11187129705B79000106032A0D397B6F7C802D2C2B61756627261E0C1D21,0F2E154147;0007385476771548,52061F20;0106111839513A2C2E2D2F8C804B4723221F63,71522920;1118000717161A2C2E3371292B56433D6375363F,0F010347208A;161A7889,292E1F0F3861;11180F00012A0D70795D7B7C39332D2C2E4E4863664C,064F478A20;5452838479195D00012A0D7B7C2C2E3348156366242526201E,0F7129;00262789,292C2E1F2B2F;040318111A17332C15290D200C7A,47450638;0004031A170F11332C2E302F1571292A657677451949,70201D52;007B343589,88;00010670175B71292A152322271E,03637C2B38;04067033392C7161262322271E1D210C,;000715547776,521F;181100012C2E2F1F,0F38;70076A363F,2920;7889,292E1F;0F707B7C00012F75,5220;528403395B2F1E20,0F01;4089,88;02060418110D332C2E415B637566262322271F20,520F;0F181100012C2E7129,5220;7C343589,88;0001020603691817452C2E2D498344,412B6A096338;393589,88;076A48,45752F29384C0F204F612B;000301394F2E154763751F27,0F707A802629710D1920;4F2C2E2B383F443D433663,0F01478A2015;201E27262322,89;0F000102700D335283845329711563,38048A7D4520;6A0339332C20528384531563,29713801000F0C47806B;005089,88;291503000D332E53261F2075,0F5238584F45;003989,88;3435000789,88;150001021745512E443D65262322,2B63387C;394889,88;00036A7415384878,45751F20240F522E834F;00010203332C2E2F1558631F,0F1920707A29712646;0717363F1A2C4F3A67433D8B,71290F010347;',
@@ -3096,26 +3096,24 @@ export class ShouXingUtil {
30963096
export class SolarTerm extends LoopTyme {
30973097
static NAMES: string[] = ['冬至', '小寒', '大寒', '立春', '雨水', '惊蛰', '春分', '清明', '谷雨', '立夏', '小满', '芒种', '夏至', '小暑', '大暑', '立秋', '处暑', '白露', '秋分', '寒露', '霜降', '立冬', '小雪', '大雪'];
30983098

3099+
protected year: number;
30993100
protected cursoryJulianDay: number;
31003101

3101-
protected constructor(year: number | string, indexOrName: number | string, cursoryJulianDay?: number) {
3102+
protected constructor(year: number | string, indexOrName: number | string) {
31023103
super(SolarTerm.NAMES, indexOrName);
3103-
if (cursoryJulianDay) {
3104-
this.cursoryJulianDay = cursoryJulianDay;
3105-
} else {
3106-
this.cursoryJulianDay = 0;
3107-
this.initByYear(SolarTerm.numeric(year, 'lunar year'), typeof indexOrName === 'number' ? indexOrName : this.index);
3104+
let y: number = SolarTerm.numeric(year, 'lunar year');
3105+
if (typeof indexOrName === 'number') {
3106+
const size: number = SolarTerm.NAMES.length;
3107+
y = ~~((y * size + indexOrName) / size);
31083108
}
3109-
}
3110-
3111-
protected initByYear(year: number, offset: number) {
3112-
const jd: number = Math.floor((year - 2000) * 365.2422 + 180);
3109+
const jd: number = Math.floor((y - 2000) * 365.2422 + 180);
31133110
// 355是2000.12冬至,得到较靠近jd的冬至估计值
31143111
let w: number = Math.floor((jd - 355 + 183) / 365.2422) * 365.2422 + 355;
31153112
if (ShouXingUtil.calcQi(w) > jd) {
31163113
w -= 365.2422;
31173114
}
3118-
this.cursoryJulianDay = ShouXingUtil.calcQi(w + 15.2184 * offset);
3115+
this.year = y;
3116+
this.cursoryJulianDay = ShouXingUtil.calcQi(w + 15.2184 * this.index);
31193117
}
31203118

31213119
static fromIndex(year: number | string, index: number): SolarTerm {
@@ -3127,7 +3125,9 @@ export class SolarTerm extends LoopTyme {
31273125
}
31283126

31293127
next(n: number): SolarTerm {
3130-
return new SolarTerm(0, this.nextIndex(n), this.cursoryJulianDay + 15.2184 * n);
3128+
const size: number = this.getSize();
3129+
const i: number = this.index + n;
3130+
return SolarTerm.fromIndex(~~((this.year * size + i) / size), this.indexOfBy(i));
31313131
}
31323132

31333133
isJie(): boolean {
@@ -3142,6 +3142,10 @@ export class SolarTerm extends LoopTyme {
31423142
return JulianDay.fromJulianDay(ShouXingUtil.qiAccurate2(this.cursoryJulianDay) + JulianDay.J2000);
31433143
}
31443144

3145+
getYear(): number {
3146+
return this.year;
3147+
}
3148+
31453149
getCursoryJulianDay(): number {
31463150
return this.cursoryJulianDay;
31473151
}
@@ -3264,18 +3268,8 @@ export class SolarHalfYear extends AbstractTyme {
32643268
}
32653269

32663270
next(n: number): SolarHalfYear {
3267-
let i: number = this.index;
3268-
let y: number = this.getYear();
3269-
if (n != 0) {
3270-
i += n;
3271-
y += ~~(i / 2);
3272-
i %= 2;
3273-
if (i < 0) {
3274-
i += 2;
3275-
y -= 1;
3276-
}
3277-
}
3278-
return SolarHalfYear.fromIndex(y, i);
3271+
const i: number = this.index + n;
3272+
return SolarHalfYear.fromIndex(~~((this.getYear() * 2 + i) / 2), this.indexOf(i, 2));
32793273
}
32803274

32813275
getMonths(): SolarMonth[] {
@@ -3337,18 +3331,8 @@ export class SolarSeason extends AbstractTyme {
33373331
}
33383332

33393333
next(n: number): SolarSeason {
3340-
let i: number = this.index;
3341-
let y: number = this.year.getYear();
3342-
if (n != 0) {
3343-
i += n;
3344-
y += ~~(i / 4);
3345-
i %= 4;
3346-
if (i < 0) {
3347-
i += 4;
3348-
y -= 1;
3349-
}
3350-
}
3351-
return SolarSeason.fromIndex(y, i);
3334+
const i: number = this.index + n;
3335+
return SolarSeason.fromIndex(~~((this.getYear() * 4 + i) / 4), this.indexOf(i, 4));
33523336
}
33533337

33543338
getMonths(): SolarMonth[] {
@@ -3426,18 +3410,8 @@ export class SolarMonth extends AbstractTyme {
34263410
}
34273411

34283412
next(n: number): SolarMonth {
3429-
let m: number = this.month;
3430-
let y: number = this.getYear();
3431-
if (n != 0) {
3432-
m += n;
3433-
y += ~~(m / 12);
3434-
m %= 12;
3435-
if (m < 1) {
3436-
m += 12;
3437-
y--;
3438-
}
3439-
}
3440-
return SolarMonth.fromYm(y, m);
3413+
const i: number = this.month - 1 + n;
3414+
return SolarMonth.fromYm(~~((this.getYear() * 12 + i) / 12), this.indexOf(i, 12) + 1);
34413415
}
34423416

34433417
getWeeks(start: number): SolarWeek[] {
@@ -3622,32 +3596,8 @@ export class SolarDay extends AbstractTyme {
36223596
}
36233597

36243598
getConstellation(): Constellation {
3625-
let index: number = 11;
36263599
const y: number = this.getMonth() * 100 + this.day;
3627-
if (y >= 321 && y <= 419) {
3628-
index = 0;
3629-
} else if (y >= 420 && y <= 520) {
3630-
index = 1;
3631-
} else if (y >= 521 && y <= 621) {
3632-
index = 2;
3633-
} else if (y >= 622 && y <= 722) {
3634-
index = 3;
3635-
} else if (y >= 723 && y <= 822) {
3636-
index = 4;
3637-
} else if (y >= 823 && y <= 922) {
3638-
index = 5;
3639-
} else if (y >= 923 && y <= 1023) {
3640-
index = 6;
3641-
} else if (y >= 1024 && y <= 1122) {
3642-
index = 7;
3643-
} else if (y >= 1123 && y <= 1221) {
3644-
index = 8;
3645-
} else if (y >= 1222 || y <= 119) {
3646-
index = 9;
3647-
} else if (y <= 218) {
3648-
index = 10;
3649-
}
3650-
return Constellation.fromIndex(index);
3600+
return Constellation.fromIndex(y > 1221 || y < 120 ? 9 : y < 219 ? 10 : y < 321 ? 11 : y < 420 ? 0 : y < 521 ? 1 : y < 622 ? 2 : y < 723 ? 3 : y < 823 ? 4 : y < 923 ? 5 : y < 1024 ? 6 : y < 1123 ? 7 : 8);
36513601
}
36523602

36533603
getName(): string {
@@ -4205,16 +4155,9 @@ export class SolarFestival extends AbstractTyme {
42054155
}
42064156

42074157
next(n: number): SolarFestival | null {
4208-
if (n === 0) {
4209-
return SolarFestival.fromYmd(this.day.getYear(), this.day.getMonth(), this.day.getDay());
4210-
}
42114158
const size: number = SolarFestival.NAMES.length;
4212-
let t: number = this.index + n;
4213-
const offset: number = this.indexOf(t, size);
4214-
if (t < 0) {
4215-
t -= size;
4216-
}
4217-
return SolarFestival.fromIndex(this.day.getYear() + ~~(t / size), offset);
4159+
const i: number = this.index + n;
4160+
return SolarFestival.fromIndex(~~((this.day.getYear() * size + i) / size), this.indexOf(i, size));
42184161
}
42194162
}
42204163

@@ -4313,16 +4256,9 @@ export class LunarFestival extends AbstractTyme {
43134256
}
43144257

43154258
next(n: number): LunarFestival {
4316-
if (n === 0) {
4317-
return LunarFestival.fromYmd(this.day.getYear(), this.day.getMonth(), this.day.getDay()) as LunarFestival;
4318-
}
43194259
const size: number = LunarFestival.NAMES.length;
4320-
let t: number = this.index + n;
4321-
const offset: number = this.indexOf(t, size);
4322-
if (t < 0) {
4323-
t -= size;
4324-
}
4325-
return LunarFestival.fromIndex(this.day.getYear() + ~~(t / size), offset) as LunarFestival;
4260+
const i: number = this.index + n;
4261+
return LunarFestival.fromIndex(~~((this.day.getYear() * size + i) / size), this.indexOf(i, size)) as LunarFestival;
43264262
}
43274263
}
43284264

@@ -4679,16 +4615,7 @@ export class ChildLimit {
46794615
}
46804616

46814617
getEndLunarYear(): LunarYear {
4682-
const endTime: SolarTime = this.getEndTime();
4683-
const solarYear: number = endTime.getYear();
4684-
let y: LunarYear = endTime.getLunarHour().getLunarDay().getLunarMonth().getLunarYear();
4685-
if (y.getYear() < solarYear) {
4686-
// 正月初一在立春之后的,农历年往后推一年
4687-
if (LunarHour.fromYmdHms(solarYear, 1, 1, 0, 0, 0).getSolarTime().isAfter(SolarTerm.fromIndex(solarYear, 3).getJulianDay().getSolarTime())) {
4688-
y = y.next(1);
4689-
}
4690-
}
4691-
return y;
4618+
return LunarYear.fromYear(this.getStartTime().getLunarHour().getYear() + this.getEndTime().getYear() - this.getStartTime().getYear());
46924619
}
46934620
}
46944621

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tyme4ts",
3-
"version": "1.2.1",
3+
"version": "1.2.2",
44
"description": "Tyme是一个非常强大的日历工具库,可以看作 Lunar 的升级版,拥有更优的设计和扩展性,支持公历和农历、星座、干支、生肖、节气、法定假日等。",
55
"main": "./dist/lib/index.cjs",
66
"module": "./dist/lib/index.mjs",

test/EightCharTest.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,9 @@ class EightCharTest {
334334
// 结束年龄
335335
equal(decadeFortune.getEndAge(), 19);
336336
// 开始年
337-
equal(decadeFortune.getStartLunarYear().getYear(), 2001);
337+
equal(decadeFortune.getStartLunarYear().getYear(), 2000);
338338
// 结束年
339-
equal(decadeFortune.getEndLunarYear().getYear(), 2010);
339+
equal(decadeFortune.getEndLunarYear().getYear(), 2009);
340340
// 干支
341341
equal(decadeFortune.getName(), '庚子');
342342
// 下一大运
@@ -347,15 +347,15 @@ class EightCharTest {
347347
// 年龄
348348
equal(fortune.getAge(), 10);
349349
// 农历年
350-
equal(fortune.getLunarYear().getYear(), 2001);
350+
equal(fortune.getLunarYear().getYear(), 2000);
351351
// 干支
352352
equal(fortune.getName(), '戊申');
353353
// 小运推移
354354
equal(fortune.next(2).getName(), '丙午');
355355
equal(fortune.next(-2).getName(), '庚戌');
356356

357357
// 流年
358-
equal(fortune.getLunarYear().getSixtyCycle().getName(), '辛巳');
358+
equal(fortune.getLunarYear().getSixtyCycle().getName(), '庚辰');
359359
}
360360

361361
@test

0 commit comments

Comments
 (0)