From 853cb2f3a9bd9e2548200ca48641fc037e126a46 Mon Sep 17 00:00:00 2001 From: 6tail <6tail@6tail.cn> Date: Sat, 11 Mar 2023 19:15:02 +0800 Subject: [PATCH] =?UTF-8?q?v1.3.3=20=E4=BC=98=E5=8C=96=E5=85=AB=E5=AD=97?= =?UTF-8?q?=E8=BD=AC=E9=98=B3=E5=8E=86=EF=BC=9B=E4=BF=AE=E5=A4=8D=E5=B0=91?= =?UTF-8?q?=E9=87=8F=E5=86=9C=E5=8E=86=E5=B9=B4=E7=9A=84=E6=9C=88=E4=BB=BD?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=9B=E6=96=B0=E5=A2=9E=E5=86=9C=E5=8E=86?= =?UTF-8?q?=E5=B9=B4=E5=A4=A9=E6=95=B0=E5=92=8C=E5=BD=93=E5=B9=B4=E6=9C=88?= =?UTF-8?q?=E4=BB=BD=E5=88=97=E8=A1=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/Lunar.test.js | 50 +++++++++++ __tests__/LunarYear.test.js | 15 ++++ __tests__/Solar.test.js | 27 ++++++ lunar.js | 160 +++++++++++++++++++++--------------- package.json | 2 +- 5 files changed, 188 insertions(+), 66 deletions(-) diff --git a/__tests__/Lunar.test.js b/__tests__/Lunar.test.js index 056147f..ddc31ec 100644 --- a/__tests__/Lunar.test.js +++ b/__tests__/Lunar.test.js @@ -590,3 +590,53 @@ test('test058', () => { const lunar = Lunar.fromYmd(1582, 9, 19); expect(lunar.getSolar().toString()).toBe('1582-10-15'); }); + +test('test059', () => { + const lunar = Lunar.fromYmd(1518, 1, 1); + expect(lunar.getSolar().toString()).toBe('1518-02-10'); +}); + +test('test060', () => { + const lunar = Lunar.fromYmd(793, 1, 1); + expect(lunar.getSolar().toString()).toBe('0793-02-15'); +}); + +test('test061', () => { + const lunar = Lunar.fromYmd(2025, -6, 1); + expect(lunar.getSolar().toString()).toBe('2025-07-25'); +}); + +test('test062', () => { + const lunar = Lunar.fromYmd(2025, 6, 1); + expect(lunar.getSolar().toString()).toBe('2025-06-25'); +}); + +test('test063', () => { + const lunar = Lunar.fromYmd(193, 1, 1); + expect(lunar.getSolar().toString()).toBe('0193-02-19'); +}); + +test('test064', () => { + const lunar = Lunar.fromYmd(288, 1, 1); + expect(lunar.getSolar().toString()).toBe('0288-02-19'); +}); + +test('test065', () => { + const lunar = Lunar.fromYmd(755, 1, 1); + expect(lunar.getSolar().toString()).toBe('0755-02-16'); +}); + +test('test066', () => { + const lunar = Lunar.fromYmd(41, 1, 1); + expect(lunar.getSolar().toString()).toBe('0041-02-20'); +}); + +test('test067', () => { + const lunar = Lunar.fromYmd(57, 1, 1); + expect(lunar.getSolar().toString()).toBe('0057-02-23'); +}); + +test('test068', () => { + const lunar = Lunar.fromYmd(345, 1, 1); + expect(lunar.getSolar().toString()).toBe('0345-02-18'); +}); diff --git a/__tests__/LunarYear.test.js b/__tests__/LunarYear.test.js index bbb96b0..87ec3ab 100644 --- a/__tests__/LunarYear.test.js +++ b/__tests__/LunarYear.test.js @@ -92,3 +92,18 @@ test('test18', () => { const year = LunarYear.fromYear(2022); expect(year.getJieQiJulianDays()).toStrictEqual([2459555.7478605337, 2459570.499405936, 2459585.217980813, 2459599.9437018055, 2459614.7018054826, 2459629.5297495862, 2459644.446920318, 2459659.4814200983, 2459674.6389274267, 2459689.9334118855, 2459705.3512322665, 2459720.890569021, 2459736.517794922, 2459752.2178259823, 2459767.9429320656, 2459783.6713957503, 2459799.3534378354, 2459814.969435438, 2459830.480632029, 2459845.8774438635, 2459861.140466851, 2459876.2746654437, 2459891.281458942, 2459906.1807667296, 2459920.9903281447, 2459935.741672728, 2459950.461561025, 2459965.187040542, 2459979.9460747372, 2459994.7736723446, 2460009.6916930582]); }); + +test('test19', () => { + const year = LunarYear.fromYear(2021); + expect(year.getDayCount()).toBe(354); +}); + +test('test20', () => { + const year = LunarYear.fromYear(2023); + expect(year.getDayCount()).toBe(384); +}); + +test('test21', () => { + const year = LunarYear.fromYear(1517); + expect(year.getDayCount()).toBe(384); +}); diff --git a/__tests__/Solar.test.js b/__tests__/Solar.test.js index 816bde9..721b808 100644 --- a/__tests__/Solar.test.js +++ b/__tests__/Solar.test.js @@ -107,3 +107,30 @@ test('22', () => { const solar = Solar.fromYmd(1582, 10, 15); expect(solar.nextDay(-5).toYmd()).toBe('1582-09-30'); }); + +test('23', () => { + const solarList = Solar.fromBaZi('癸卯', '甲寅', '癸丑', '甲子', 2, 1843); + const timeList = []; + solarList.forEach(solar => { + timeList.push(solar.toYmdHms()); + }) + expect(timeList).toStrictEqual(['2023-02-24 23:00:00', '1843-02-08 23:00:00']); +}); + +test('24', () => { + const solarList = Solar.fromBaZi('己亥', '丁丑', '壬寅', '戊申'); + const timeList = []; + solarList.forEach(solar => { + timeList.push(solar.toYmdHms()); + }) + expect(timeList).toStrictEqual(['1960-01-15 16:00:00', '1900-01-29 16:00:00']); +}); + +test('25', () => { + const solarList = Solar.fromBaZi('己亥', '丙子', '癸酉', '庚申'); + const timeList = []; + solarList.forEach(solar => { + timeList.push(solar.toYmdHms()); + }) + expect(timeList).toStrictEqual(['1959-12-17 16:00:00']); +}); diff --git a/lunar.js b/lunar.js index 19c5e01..5eda145 100644 --- a/lunar.js +++ b/lunar.js @@ -361,8 +361,7 @@ if (isNaN(months)) { throw new Error('wrong months ' + om); } - var month = SolarMonth.fromYm(this._p.year, this._p.month); - month = month.next(months); + var month = SolarMonth.fromYm(this._p.year, this._p.month).next(months); var y = month.getYear(); var m = month.getMonth(); var d = this._p.day; @@ -505,10 +504,15 @@ var _fromBaZi=function(yearGanZhi,monthGanZhi,dayGanZhi,timeGanZhi,sect,baseYear){ sect *= 1; if(isNaN(sect)){ - sect=2; + sect = 2; + } + if (1 !== sect) { + sect = 2; + } + baseYear *= 1; + if(isNaN(baseYear)){ + baseYear = 1900; } - sect = (1===sect)?1:2; - baseYear = (undefined===baseYear)?1900:baseYear; var l = []; var years = []; var today = _fromDate(new Date()); @@ -517,31 +521,42 @@ offsetYear += 60; } var startYear = today.getYear() - offsetYear - 1; - while (true) { + var minYear = baseYear - 2; + while (startYear >= minYear) { years.push(startYear); startYear -= 60; - if (startYear < baseYear) { - years.push(baseYear); + } + var hours = []; + var timeZhi = timeGanZhi.substr(1); + var i = 1; + var j = LunarUtil.ZHI.length; + for(;i 2) { index = 2; } @@ -2011,8 +2022,7 @@ * @return number 周序号,从1开始 */ getIndex:function(){ - var firstDayWeek = Solar.fromYmd(this._p.year,this._p.month,1).getWeek(); - var offset = firstDayWeek - this._p.start; + var offset = Solar.fromYmd(this._p.year,this._p.month,1).getWeek() - this._p.start; if(offset < 0) { offset += 7; } @@ -2023,8 +2033,7 @@ * @return number 周序号,从1开始 */ getIndexInYear:function(){ - var firstDayWeek = Solar.fromYmd(this._p.year,1,1).getWeek(); - var offset = firstDayWeek - this._p.start; + var offset = Solar.fromYmd(this._p.year,1,1).getWeek() - this._p.start; if(offset < 0) { offset += 7; } @@ -2068,10 +2077,10 @@ week = _fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), start); } } else { - var size = SolarUtil.getWeeksOfMonth(week.getYear(), week.getMonth(), this._p.start); + var size = SolarUtil.getWeeksOfMonth(week.getYear(), week.getMonth(), start); if (size === index) { var lastDay = week.getFirstDay().next(6); - week = _fromYmd(lastDay.getYear(), lastDay.getMonth(), lastDay.getDay(), this._p.start); + week = _fromYmd(lastDay.getYear(), lastDay.getMonth(), lastDay.getDay(), start); weekMonth = week.getMonth(); } else { solar = Solar.fromYmd(week.getYear(), week.getMonth(), SolarUtil.getDaysOfMonth(week.getYear(), week.getMonth())); @@ -2302,8 +2311,7 @@ if(isNaN(seasons)){ throw new Error('wrong seasons ' + os); } - var month = SolarMonth.fromYm(this._p.year, this._p.month); - month = month.next(3 * seasons); + var month = SolarMonth.fromYm(this._p.year, this._p.month).next(3 * seasons); return _fromYm(month.getYear(), month.getMonth()); }, /** @@ -2376,8 +2384,7 @@ if(isNaN(halfYears)){ throw new Error('wong halfYears ' + oh); } - var month = SolarMonth.fromYm(this._p.year, this._p.month); - month = month.next(6 * halfYears); + var month = SolarMonth.fromYm(this._p.year, this._p.month).next(6 * halfYears); return _fromYm(month.getYear(), month.getMonth()); }, /** @@ -2506,6 +2513,26 @@ getZhi:function(){return LunarUtil.ZHI[this._p.zhiIndex+1];}, getGanZhi:function(){return this.getGan()+this.getZhi();}, getJieQiJulianDays:function(){return this._p.jieQiJulianDays;}, + getDayCount:function(){ + var n = 0; + for (var i = 0, j = this._p.months.length; i < j; i++) { + var m = this._p.months[i]; + if (m.getYear() === this._p.year) { + n += m.getDayCount(); + } + } + return n; + }, + getMonthsInYear:function(){ + var l = []; + for (var i = 0, j = this._p.months.length; i < j; i++) { + var m = this._p.months[i]; + if (m.getYear() === this._p.year) { + l.push(m); + } + } + return l; + }, getMonths:function(){return this._p.months;}, getMonth:function(lunarMonth){ var om = lunarMonth; @@ -2679,7 +2706,9 @@ // 冬至前的初一 var w = ShouXingUtil.calcShuo(jq[0]); if (w > jq[0]) { - w -= 29.5306; + if (currentYear !== 41 && currentYear !== 193 && currentYear !== 288 && currentYear !== 345 && currentYear !== 918 && currentYear !== 1013) { + w -= 29.5306; + } } // 递推每月初一 for (i = 0; i < 16; i++) { @@ -2690,39 +2719,40 @@ dayCounts.push(Math.floor(hs[i + 1] - hs[i])); } - var currentYearLeap = _LEAP['_' + currentYear]; - if (!currentYearLeap) { - currentYearLeap = -1; - if (hs[13] <= jq[24]) { - i = 1; - while (hs[i + 1] > jq[2 * i] && i < 13) { - i++; + var prevYear = currentYear - 1; + var leapYear = -1; + var leapIndex = -1; + + var leap = _LEAP['_' + currentYear]; + if (!leap) { + leap = _LEAP['_' + prevYear]; + if (!leap) { + if (hs[13] <= jq[24]) { + i = 1; + while (hs[i + 1] > jq[2 * i] && i < 13) { + i++; + } + leapYear = currentYear; + leapIndex = i; } - currentYearLeap = i; + } else { + leapYear = prevYear; + leapIndex = leap - 12; } + } else { + leapYear = currentYear; + leapIndex = leap; } - var prevYear = currentYear - 1; - var prevYearLeap = _LEAP['_' + prevYear]; - prevYearLeap = prevYearLeap ? prevYearLeap - 12 : -1; - - var y = this._p.year - 1; + var y = prevYear; var m = 11; for (i = 0, j = dayCounts.length; i < j; i++) { var cm = m; - var isNextLeap = false; - if (y === currentYear && i === currentYearLeap) { + if (y === leapYear && i === leapIndex) { cm = -cm; - } else if (y === prevYear && i === prevYearLeap) { - cm = -cm; - } - if (y === currentYear && i + 1 === currentYearLeap) { - isNextLeap = true; - } else if (y === prevYear && i + 1 === prevYearLeap) { - isNextLeap = true; } this._p.months.push(LunarMonth._(y, cm, dayCounts[i], hs[i] + Solar.J2000)); - if (!isNextLeap) { + if (y !== leapYear || i + 1 !== leapIndex) { m++; } if (m === 13) { @@ -4392,8 +4422,8 @@ toString:function(){return this.getGanZhi();} }; }; - return { - fromYmdHms:function(lunarYear,lunarMonth,lunarDay,hour,minute,second){return _fromYmdHms(lunarYear,lunarMonth,lunarDay,hour,minute,second);}, + return { + fromYmdHms:function(lunarYear,lunarMonth,lunarDay,hour,minute,second){return _fromYmdHms(lunarYear,lunarMonth,lunarDay,hour,minute,second);} }; })(); var FotoUtil = (function(){ diff --git a/package.json b/package.json index 4a23d20..090e000 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lunar-javascript", - "version": "1.3.2", + "version": "1.3.3", "description": "lunar is a calendar library for Solar and Chinese Lunar.", "main": "index.js", "scripts": {