SylarLong / iztro

⭐A lightweight open-source JavaScript library for obtaining The Purple Star Astrology (Zi Wei Dou Shu) astrolabe information.. 支持多语言轻量级获取紫微斗数排盘信息的javascript开源库。
https://iztro.com
MIT License
1.93k stars 252 forks source link

[version]:小限计算问题 #207

Closed bk1d closed 1 week ago

bk1d commented 1 week ago

描述(Description)

小限/虚岁计算好像有问题,我试了不同软件结果与库返回的不一致。

版本(Version)

重现(Reproduce)

当前日期为:2024-10-12 当把生日改到:1991-10-07 时虚岁为33岁 当把生日改到:1991-10-08 时虚岁为34岁

命理天机,测测等App都是虚岁34岁

const astrolabe = astro.astrolabeBySolarDate("1991-10-08", 4, "男", true, "zh-CN"); const horoscope = astrolabe.horoscope('2024-10-12', 2);


结果:
```json
  ...
  "age": {
      "index": 7,
      "nominalAge": 33,
      "name": "小限",
      "heavenlyStem": "丁",
      "earthlyBranch": "酉"
   }
   ...
bk1d commented 1 week ago

我发现问题所在了,如果生日的月份与排盘日期在同一个月,可能这个逻辑会出问题:

// iztro/src/astro/FunctionalAstrolabe.ts

// 虚岁
  let nominalAge = _date.lunarYear - _birthday.lunarYear;
  // 是否童限
  let isChildhood = false;

  // 假如目标日期已经过了生日,则需要加1岁
  // 比如 2022年九月初一 出生的人,在出生后虚岁为 1 岁
  // 但在 2023年九月初二 以后,虚岁则为 2 岁
  if (
    (_date.lunarYear === _birthday.lunarYear &&
      _date.lunarMonth === _birthday.lunarMonth &&
      _date.lunarDay > _birthday.lunarDay) ||
    _date.lunarMonth > _birthday.lunarMonth // ⚠️!!!这里无法判断,导致虚岁没有 +1!!!
  ) {
    nominalAge += 1;
  }

我看维基百科上关于虚岁的计算,按农历正月初一来算的话Wiki

是不是改成下面这样就好了?

  // 虚岁
  let nominalAge = _date.lunarYear - _birthday.lunarYear + 1;
  // 或者?
  if ( _date.lunarYear >= _birthday.lunarYear )
  {
    nominalAge += 1;
  }
SylarLong commented 1 week ago

@bk1d 确实,按照虚岁的定义,是生命体在这个世界上生存了多少年,所以理论上应该只用考虑年份。 我存疑的地方是,如果一个小孩儿是农历腊月三十出生的, 那么按照虚岁的定义,正月初一的时候这个小孩儿虚岁就已经是两岁了。 不过这个地方我正在考虑把它做到参数配置里,用哪种方式计算由使用者自己决定。 感谢关注以及建议!

happy coding~

bk1d commented 1 week ago

这样最好,我的生日就是这样。我家里说我生下来没几天就两岁了😂