dsh-metaphysics 0.59.0 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +154 -5
- package/README.md +15 -0
- package/client.almanac.js +65 -61
- package/client.bazi.js +111 -107
- package/client.chenggu.js +65 -61
- package/client.convert.js +65 -61
- package/client.daliuren.js +120 -116
- package/client.fengshui.js +67 -63
- package/client.hepan.js +111 -107
- package/client.js +421 -327
- package/client.liuyao.js +120 -116
- package/client.mbti.js +64 -60
- package/client.name.js +70 -66
- package/client.numerology.js +68 -64
- package/client.qimen.js +121 -117
- package/client.star.js +68 -64
- package/client.tarot.js +118 -114
- package/client.trend.js +112 -108
- package/client.xiaoliuren.js +79 -75
- package/client.zeri.js +64 -60
- package/client.ziwei.js +113 -109
- package/engine/bazi.js +800 -740
- package/engine/calendar.js +8 -2
- package/engine/diff.js +3 -0
- package/engine/dst.js +28 -1
- package/engine/geju.js +548 -547
- package/engine/handle.js +6 -2
- package/engine/index.js +154 -19
- package/engine/interpret.js +4 -1
- package/engine/limits.js +5 -0
- package/engine/lunar.js +10 -11
- package/engine/plain-summary.js +604 -0
- package/engine/random.js +9 -1
- package/engine/rectify.js +26 -4
- package/engine/trend.js +32 -20
- package/engine/zeri.js +25 -9
- package/engine/ziwei.js +5 -2
- package/index.js +34 -12
- package/package.json +13 -4
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +2887 -1391
package/engine/calendar.js
CHANGED
|
@@ -196,13 +196,19 @@ export function termInstantJd(year, index) {
|
|
|
196
196
|
export function jdToParts(jdLocal) {
|
|
197
197
|
const jdn = Math.floor(jdLocal + 0.5);
|
|
198
198
|
const frac = jdLocal + 0.5 - jdn;
|
|
199
|
-
|
|
199
|
+
// 按「整分钟向下取」而不是四舍五入:23:59:45 一进位就成了 1440 分,
|
|
200
|
+
// 旧写法把小时取模、日序不动,于是这一瞬时塌回「当日 00:00」——
|
|
201
|
+
// 日柱退一天、partsToJd 往返回来差将近一天(晚子时换日与真太阳时跨午夜正好踩在刀口上)。
|
|
202
|
+
// 向下取后 hour/minute 与 jdn 永远自洽:拆出来的那一天,就是这一刻所在的那一天。
|
|
203
|
+
// 但向下取会被浮点噪声咬住:JD 里的 13:00 常算成 779.99999 分,直接 floor 就是 12:59,
|
|
204
|
+
// 未时变成午时。先归到最近的整秒(输入精度到分,误差远小于一秒),再向下取整分。
|
|
205
|
+
const totalMinutes = Math.min(1439, Math.floor(Math.round(frac * 86400) / 60));
|
|
200
206
|
const { year, month, day } = fromJDN(jdn);
|
|
201
207
|
return {
|
|
202
208
|
year,
|
|
203
209
|
month,
|
|
204
210
|
day,
|
|
205
|
-
hour: Math.floor(totalMinutes / 60)
|
|
211
|
+
hour: Math.floor(totalMinutes / 60),
|
|
206
212
|
minute: totalMinutes % 60,
|
|
207
213
|
};
|
|
208
214
|
}
|
package/engine/diff.js
CHANGED
|
@@ -26,6 +26,9 @@ const IGNORE_KEYS = new Set([
|
|
|
26
26
|
'handle', 'handleError',
|
|
27
27
|
// 一句话改参的回显:换口径时它必然不同(等于另一次请求),不是盘面差异
|
|
28
28
|
'revision',
|
|
29
|
+
// 顶部「人话总结」是从盘面派生出来的叙述,不是盘面本身:换一档口径,
|
|
30
|
+
// 它必然跟着改写(句子会重排),但要看的是星位、日柱这些有没有动。
|
|
31
|
+
'brief', 'briefError',
|
|
29
32
|
]);
|
|
30
33
|
|
|
31
34
|
const isObject = (v) => v !== null && typeof v === 'object';
|
package/engine/dst.js
CHANGED
|
@@ -34,6 +34,26 @@ export function inDstSpan(t) {
|
|
|
34
34
|
return true;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* 换表当天绕不开的两个钟面区间:
|
|
39
|
+
* - 起算日 02:00–02:59:钟表从 02:00 直接拨到 03:00,这个读数在当年根本不存在;
|
|
40
|
+
* - 终止日 01:00–01:59:钟表往回拨一小时,同一读数会走两遍,对应两个真实时刻。
|
|
41
|
+
* 两者都不是「算错了」,而是输入本身有歧义,需要告诉调用方我们按哪种读法折的。
|
|
42
|
+
* @param {{year:number,month:number,day:number,hour:number,minute?:number}} t
|
|
43
|
+
* @returns {'gap'|'twice'|null}
|
|
44
|
+
*/
|
|
45
|
+
export function dstAmbiguity(t) {
|
|
46
|
+
const span = DST_SPANS[t.year];
|
|
47
|
+
if (!span) return null;
|
|
48
|
+
const [sy, sm, sd] = span[0].split('-').map(Number);
|
|
49
|
+
const [ey, em, ed] = span[1].split('-').map(Number);
|
|
50
|
+
const n = ORD(t.year, t.month, t.day);
|
|
51
|
+
const minutes = t.hour * 60 + (t.minute || 0);
|
|
52
|
+
if (n === ORD(sy, sm, sd) && minutes >= 120 && minutes < 180) return 'gap';
|
|
53
|
+
if (n === ORD(ey, em, ed) && minutes >= 60 && minutes < 120) return 'twice';
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
|
|
37
57
|
/**
|
|
38
58
|
* 夏令时校正:钟面时间减 1 小时(跨日正确回退)。
|
|
39
59
|
* @param {{year:number,month:number,day:number,hour:number,minute?:number}} t
|
|
@@ -53,10 +73,17 @@ export function applyDst(t) {
|
|
|
53
73
|
day = daysInMonth(year, month);
|
|
54
74
|
}
|
|
55
75
|
}
|
|
76
|
+
const amb = dstAmbiguity(t);
|
|
56
77
|
return {
|
|
57
78
|
year, month, day, hour, minute,
|
|
58
79
|
applied: true,
|
|
59
|
-
note: `检出自 ${DST_SPANS[t.year][0]} 至 ${DST_SPANS[t.year][1]} 的中国夏令时:出生钟面时间已减 1
|
|
80
|
+
note: `检出自 ${DST_SPANS[t.year][0]} 至 ${DST_SPANS[t.year][1]} 的中国夏令时:出生钟面时间已减 1 小时校正`
|
|
81
|
+
+ (amb === 'gap'
|
|
82
|
+
? ';这一天 02:00–03:00 钟表直接跳过,所给钟面时间在当年并不存在——这里按「拨快后的读数」回退一小时,'
|
|
83
|
+
+ '若登记的本是标准时间,请传 dst:false 重排。'
|
|
84
|
+
: amb === 'twice'
|
|
85
|
+
? ';这一天 01:00–02:00 因回拨走了两遍,同一钟面时间对应两个真实时刻——这里按夏令时的那一遍(回退一小时)取。'
|
|
86
|
+
: ''),
|
|
60
87
|
};
|
|
61
88
|
}
|
|
62
89
|
|