diff --git a/__tests__/SolarWeek.test.js b/__tests__/SolarWeek.test.js index 6f206b3..fefcf29 100644 --- a/__tests__/SolarWeek.test.js +++ b/__tests__/SolarWeek.test.js @@ -31,3 +31,9 @@ test('test2', () => { const week = SolarWeek.fromYmd(2021, 5, 4, start); expect(week.getIndex()).toBe(2); }); + +test('test3', () => { + const start = 0; + const week = SolarWeek.fromYmd(2022, 3, 6, start); + expect(week.getIndexInYear()).toBe(11); +}); diff --git a/__tests__/Yun.test.js b/__tests__/Yun.test.js index 1cb0052..3bf1211 100644 --- a/__tests__/Yun.test.js +++ b/__tests__/Yun.test.js @@ -31,3 +31,30 @@ it('test3', () => { expect(yun.getStartDay()).toBe(0); expect(yun.getStartSolar().toYmd()).toBe('2020-02-06'); }); + +it('test4', () => { + const solar = Solar.fromYmdHms(2022, 3, 9, 20, 51, 0); + const lunar = solar.getLunar(); + const eightChar = lunar.getEightChar(); + const yun = eightChar.getYun(1); + expect(yun.getStartSolar().toYmd()).toBe('2030-12-19'); +}); + +it('test5', () => { + const solar = Solar.fromYmdHms(2022, 3, 9, 20, 51, 0); + const lunar = solar.getLunar(); + const eightChar = lunar.getEightChar(); + const yun = eightChar.getYun(1, 2); + expect(yun.getStartYear()).toBe(8); + expect(yun.getStartMonth()).toBe(9); + expect(yun.getStartDay()).toBe(2); + expect(yun.getStartSolar().toYmd()).toBe('2030-12-12'); +}); + +it('test6', () => { + const solar = Solar.fromYmdHms(2018, 6, 11, 9, 30, 0); + const lunar = solar.getLunar(); + const eightChar = lunar.getEightChar(); + const yun = eightChar.getYun(0, 2); + expect(yun.getStartSolar().toYmd()).toBe('2020-03-21'); +}); diff --git a/lunar.js b/lunar.js index 0453406..eaf9cbd 100644 --- a/lunar.js +++ b/lunar.js @@ -1735,6 +1735,19 @@ } return Math.ceil((this._p.day + offset)/7); }, + /** + * 获取当前日期是在当年第几周 + * @return number 周序号,从1开始 + */ + getIndexInYear:function(){ + var firstDate = ExactDate.fromYmd(this._p.year, 1, 1); + var firstDayWeek = firstDate.getDay(); + var offset = firstDayWeek - this._p.start; + if(offset < 0) { + offset += 7; + } + return Math.ceil((SolarUtil.getDaysInYear(this._p.year, this._p.month, this._p.day) + offset)/7); + }, /** * 周推移 * @param weeks 推移的周数,负数为倒推 @@ -3520,7 +3533,8 @@ }, getShenGongNaYin:function(){return LunarUtil.NAYIN[this.getShenGong()];}, getLunar:function(){return this._p.lunar;}, - getYun:function(gender){ + getYun:function(gender, sect){ + sect = (2 == sect) ? sect : 1; var lunar = this.getLunar(); var yang = 0 === lunar.getYearGanIndexExact() % 2; var man = 1 === gender; @@ -3531,25 +3545,44 @@ var current = lunar.getSolar(); var start = forward ? current : prev.getSolar(); var end = forward ? next.getSolar() : current; - const endTimeZhiIndex = (end.getHour() === 23) ? 11 : LunarUtil.getTimeZhiIndex(end.toYmdHms().substr(11, 5)); - const startTimeZhiIndex = (start.getHour() === 23) ? 11 : LunarUtil.getTimeZhiIndex(start.toYmdHms().substr(11, 5)); - // 时辰差 - var hourDiff = endTimeZhiIndex - startTimeZhiIndex; - // 天数差 - var dayDiff = ExactDate.getDaysBetweenYmd(start.getYear(), start.getMonth(), start.getDay(), end.getYear(), end.getMonth(), end.getDay()); - if (hourDiff < 0) { - hourDiff += 12; - dayDiff--; + + var year; + var month; + var day; + var hour = 0; + + if (2 === sect) { + var minutes = Math.floor((end.getCalendar() - start.getCalendar()) / 60000); + year = Math.floor(minutes / 4320); + minutes -= year * 4320; + month = Math.floor(minutes / 360); + minutes -= month * 360; + day = Math.floor(minutes / 12); + minutes -= day * 12; + hour = minutes * 2; + } else { + var endTimeZhiIndex = (end.getHour() === 23) ? 11 : LunarUtil.getTimeZhiIndex(end.toYmdHms().substr(11, 5)); + var startTimeZhiIndex = (start.getHour() === 23) ? 11 : LunarUtil.getTimeZhiIndex(start.toYmdHms().substr(11, 5)); + // 时辰差 + var hourDiff = endTimeZhiIndex - startTimeZhiIndex; + // 天数差 + var dayDiff = ExactDate.getDaysBetweenYmd(start.getYear(), start.getMonth(), start.getDay(), end.getYear(), end.getMonth(), end.getDay()); + if (hourDiff < 0) { + hourDiff += 12; + dayDiff--; + } + var monthDiff = Math.floor(hourDiff * 10 / 30); + month = dayDiff * 4 + monthDiff; + day = hourDiff * 10 - monthDiff * 30; + year = Math.floor(month / 12); + month = month - year * 12; } - var monthDiff = Math.floor(hourDiff * 10 / 30); - var month = dayDiff * 4 + monthDiff; - var day = hourDiff * 10 - monthDiff * 30; - var year = Math.floor(month / 12); - month = month - year * 12; + return { year: year, month: month, - day: day + day: day, + hour: hour }; })(); var buildLiuYue = function(liuNian, index){ @@ -3729,6 +3762,7 @@ startYear: start.year, startMonth: start.month, startDay: start.day, + startHour: start.hour, forward: forward, lunar: lunar }, @@ -3736,6 +3770,7 @@ getStartYear: function(){return this._p.startYear;}, getStartMonth: function(){return this._p.startMonth;}, getStartDay: function(){return this._p.startDay;}, + getStartHour: function(){return this._p.startHour;}, isForward: function(){return this._p.forward;}, getLunar: function(){return this._p.lunar;}, getStartSolar: function(){ @@ -3744,6 +3779,7 @@ c.setFullYear(birth.getYear() + this._p.startYear); c.setMonth(birth.getMonth()-1+this._p.startMonth); c.setDate(birth.getDay() + this._p.startDay); + c.setHours(birth.getHour() + this._p.startHour); return Solar.fromDate(c); }, getDaYun: function(n){ diff --git a/package.json b/package.json index 4431a86..5084197 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lunar-javascript", - "version": "1.2.27", + "version": "1.2.28", "description": "lunar is a calendar library for Solar and Chinese Lunar.", "main": "index.js", "scripts": {