waterbeside / lunisolar

Typescript农历库,支持阴历公历互转,支持各类黄历数据查询,如八字四柱、阴历、神煞宜忌、建除十二神、胎神占方、吉神方位、五行纳音等。支持自定义插件。
https://lunisolar.js.org
GNU General Public License v3.0
208 stars 21 forks source link

问题:23:00之前与之后的两个日期的天干地支输出相同 #25

Closed Qing8 closed 6 months ago

Qing8 commented 7 months ago

感谢你付出时间做出这个代码仓库并且保持清楚的文档! :)

根据文档 - 换日 lunisolar会在23:00进行换日,可是以下代码返回的两个日期有相反的结果,不知道是否是我的使用方式有问题?

// Time:  2024/3/6 22:00
  const ten = "2024/3/6 22:00"
  const tenChar8 = lunisolar(ten).char8;
  console.log(`${ten}: ${tenChar8.year.stem.toString()}, ${tenChar8.year.branch.toString()} \
  ${tenChar8.month.stem.toString()}, ${tenChar8.month.branch.toString()} \
  ${tenChar8.day.stem.toString()}, ${tenChar8.day.branch.toString()}
  `);

// Time: 2024/3/6 23:00
  const eleven = "2024/3/6 23:00"
  const elevenChar8 = lunisolar(eleven).char8;
  console.log(`${eleven}: ${elevenChar8.year.stem.toString()}, ${elevenChar8.year.branch.toString()} \
  ${elevenChar8.month.stem.toString()}, ${elevenChar8.month.branch.toString()} \
  ${elevenChar8.day.stem.toString()}, ${elevenChar8.day.branch.toString()} `);

输出:

2024/3/6 22:00: 甲, 辰     丁, 卯     庚, 午    <- 潜在的错误输出
2024/3/6 23:00: 甲, 辰     丁, 卯     庚, 午

预期输出:

2024/3/6 22:00: 甲, 辰     丁, 卯     己, 巳
2024/3/6 23:00: 甲, 辰     丁, 卯     庚, 午

谢谢!

waterbeside commented 7 months ago

感谢你付出时间做出这个代码仓库并且保持清楚的文档! :)

根据文档 - 换日 lunisolar会在23:00进行换日,可是以下代码返回的两个日期有相反的结果,不知道是否是我的使用方式有问题?

// Time:  2024/3/6 22:00
  const ten = "2024/3/6 22:00"
  const tenChar8 = lunisolar(ten).char8;
  console.log(`${ten}: ${tenChar8.year.stem.toString()}, ${tenChar8.year.branch.toString()} \
  ${tenChar8.month.stem.toString()}, ${tenChar8.month.branch.toString()} \
  ${tenChar8.day.stem.toString()}, ${tenChar8.day.branch.toString()}
  `);

// Time: 2024/3/6 23:00
  const eleven = "2024/3/6 23:00"
  const elevenChar8 = lunisolar(eleven).char8;
  console.log(`${eleven}: ${elevenChar8.year.stem.toString()}, ${elevenChar8.year.branch.toString()} \
  ${elevenChar8.month.stem.toString()}, ${elevenChar8.month.branch.toString()} \
  ${elevenChar8.day.stem.toString()}, ${elevenChar8.day.branch.toString()} `);

输出:

2024/3/6 22:00: 甲, 辰     丁, 卯     庚, 午    <- 潜在的错误输出
2024/3/6 23:00: 甲, 辰     丁, 卯     庚, 午

预期输出:

2024/3/6 22:00: 甲, 辰     丁, 卯     己, 巳
2024/3/6 23:00: 甲, 辰     丁, 卯     庚, 午

谢谢!

您好,我直接复制你的代码测试,和预期的输出一致。你再检查一下你的业务代码有没有问题?另外如果使用较低版本的lunisolar,建议升级一下。 谢谢。

mmexport1709798301374.jpg

mmexport1709798635010.jpg

Qing8 commented 7 months ago

@waterbeside 谢谢你的及时回复!

  1. lunisolar的版本在使用最新的2.4.0
  2. 我以为和我所在的时区(EST)相关,所以把时间转换为UTC时间后再次尝试,但是两个时间的结果还是相同的。

    const ten = "2024/3/7 03:00" // UTC time for "2024/3/6 22:00"
    const tenChar8 = lunisolar(ten, { isUTC:true }).char8;  
    console.log(`
      ${ten}: ${tenChar8.year.stem.toString()}, ${tenChar8.year.branch.toString()} \
      ${tenChar8.month.stem.toString()}, ${tenChar8.month.branch.toString()} \
      ${tenChar8.day.stem.toString()}, ${tenChar8.day.branch.toString()} \
    `);
    
    const eleven = "2024/3/7 04:00" // UTC time for "2024/3/6 23:00"
    const elevenChar8 = lunisolar(eleven, { isUTC:true }).char8;
    console.log(`
      ${eleven}: ${elevenChar8.year.stem.toString()}, ${elevenChar8.year.branch.toString()} \
      ${elevenChar8.month.stem.toString()}, ${elevenChar8.month.branch.toString()} \
      ${elevenChar8.day.stem.toString()}, ${elevenChar8.day.branch.toString()} \
    `);
image

这个就是我目前保留下来的全部代码了,使用的是react + javascript.

请问你还可以想到任何其他原因会造成这两个相同输出吗?非常感谢!

Qing8 commented 7 months ago

我可能找到了原因。lunisolar应该是把我的当地时间(EST)换算成北京时间进行计算的,我测试了几个时间,

代码 ``` const dateList = ["2024/3/6 09:00", "2024/3/6 10:00", "2024/3/6 22:00", "2024/3/6 23:00"]; for (let i = 0; i < dateList.length; i++) { const t = dateList[i]; const tenChar8 = lunisolar(t).char8; console.log(` ${t}: ${tenChar8.year.stem.toString()}, ${tenChar8.year.branch.toString()} \ ${tenChar8.month.stem.toString()}, ${tenChar8.month.branch.toString()} \ ${tenChar8.day.stem.toString()}, ${tenChar8.day.branch.toString()} \ `); } ```
当地EST时间字符串 相当于北京时间 根据北京时间计算的天干地支 我希望的天干地支
2024/3/6 09:00 2024/3/6 22:00 丁卯月 己巳日 丁卯月 己巳日
2024/3/6 10:00 2024/3/6 23:00 丁卯月 庚午日 丁卯月 己巳日
2024/3/6 22:00 2024/3/7 11:00 丁卯月 庚午日 丁卯月 己巳日
2024/3/6 23:00 2024/3/7 12:00 丁卯月 庚午日 丁卯月 庚午日

下图里面的输出和 根据北京时间计算的天干地支 是一致的,由此可以说明lunisolar的代码应该是正确的。

image

请问如果我想根据EST时间来计算天干地支(得到 我希望的天干地支 的结果),应该如何配置呢?

waterbeside commented 7 months ago

我可能找到了原因。lunisolar应该是把我的当地时间(EST)换算成北京时间进行计算的,我测试了几个时间,

代码 当地EST时间字符串 相当于北京时间 根据北京时间计算的天干地支 我希望的天干地支 2024/3/6 09:00 2024/3/6 22:00 丁卯月 己巳日 丁卯月 己巳日 2024/3/6 10:00 2024/3/6 23:00 丁卯月 庚午日 丁卯月 己巳日 2024/3/6 22:00 2024/3/7 11:00 丁卯月 庚午日 丁卯月 己巳日 2024/3/6 23:00 2024/3/7 12:00 丁卯月 庚午日 丁卯月 庚午日 下图里面的输出和 根据北京时间计算的天干地支 是一致的,由此可以说明lunisolar的代码应该是正确的。

image

请问如果我想根据EST时间来计算天干地支(得到 我希望的天干地支 的结果),应该如何配置呢?

你好,感谢你提出的问题,干支改成地方时换日的确更符合使用习惯,我已进行修改,请试试 v2.5.0 版本,谢谢。 (ps: 另外,读取当前日期多个干支的话,使用format方法可以更简化)