From f4e6fa3c9a36410026c903da95cefc4e0bafb537 Mon Sep 17 00:00:00 2001 From: 6tail <6tail@6tail.cn> Date: Fri, 3 Feb 2023 12:50:17 +0800 Subject: [PATCH] =?UTF-8?q?v1.3.0=20=E5=BD=BB=E5=BA=95=E6=8A=9B=E5=BC=83js?= =?UTF-8?q?=E5=8E=9F=E7=94=9FDate=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __tests__/SolarUtil.test.js | 70 +-- lunar.js | 994 ++++++++++++++++++++++++------------ package.json | 2 +- 3 files changed, 701 insertions(+), 365 deletions(-) diff --git a/__tests__/SolarUtil.test.js b/__tests__/SolarUtil.test.js index 6f81d09..a24866f 100644 --- a/__tests__/SolarUtil.test.js +++ b/__tests__/SolarUtil.test.js @@ -1,4 +1,4 @@ -var {SolarUtil} = require('../lunar'); +var {SolarUtil, Solar} = require('../lunar'); test('isLeapYear()', () => { expect(SolarUtil.isLeapYear(2020)).toBe(true); @@ -11,59 +11,59 @@ test('getDaysOfMonth()', () => { }); test('addDays', () => { - var ymd = SolarUtil.addDays(2022,1,1, 1); - expect(ymd.year).toBe(2022); - expect(ymd.month).toBe(1); - expect(ymd.day).toBe(2); + var solar = Solar.fromYmd(2022,1,1).next(1); + expect(solar.getYear()).toBe(2022); + expect(solar.getMonth()).toBe(1); + expect(solar.getDay()).toBe(2); }); test('addDays2', () => { - var ymd = SolarUtil.addDays(2022,1,31, 1); - expect(ymd.year).toBe(2022); - expect(ymd.month).toBe(2); - expect(ymd.day).toBe(1); + var solar = Solar.fromYmd(2022,1,31).next(1); + expect(solar.getYear()).toBe(2022); + expect(solar.getMonth()).toBe(2); + expect(solar.getDay()).toBe(1); }); test('addDays3', () => { - var ymd = SolarUtil.addDays(2022,1,1, 365); - expect(ymd.year).toBe(2023); - expect(ymd.month).toBe(1); - expect(ymd.day).toBe(1); + var solar = Solar.fromYmd(2022,1,1).next(365); + expect(solar.getYear()).toBe(2023); + expect(solar.getMonth()).toBe(1); + expect(solar.getDay()).toBe(1); }); test('addDays4', () => { - var ymd = SolarUtil.addDays(2023,1,1, -365); - expect(ymd.year).toBe(2022); - expect(ymd.month).toBe(1); - expect(ymd.day).toBe(1); + var solar = Solar.fromYmd(2023,1,1).next(-365); + expect(solar.getYear()).toBe(2022); + expect(solar.getMonth()).toBe(1); + expect(solar.getDay()).toBe(1); }); test('addDays5', () => { - var ymd = SolarUtil.addDays(1582,10,4, 1); - expect(ymd.year).toBe(1582); - expect(ymd.month).toBe(10); - expect(ymd.day).toBe(15); + var solar = Solar.fromYmd(1582,10,4).next(1); + expect(solar.getYear()).toBe(1582); + expect(solar.getMonth()).toBe(10); + expect(solar.getDay()).toBe(15); }); test('addDays6', () => { - var ymd = SolarUtil.addDays(1582,10,4, 18); - expect(ymd.year).toBe(1582); - expect(ymd.month).toBe(11); - expect(ymd.day).toBe(1); + var solar = Solar.fromYmd(1582,10,4).next(18); + expect(solar.getYear()).toBe(1582); + expect(solar.getMonth()).toBe(11); + expect(solar.getDay()).toBe(1); }); test('addDays7', () => { - var ymd = SolarUtil.addDays(1582,11,1, -18); - expect(ymd.year).toBe(1582); - expect(ymd.month).toBe(10); - expect(ymd.day).toBe(4); + var solar = Solar.fromYmd(1582,11,1).next(-18); + expect(solar.getYear()).toBe(1582); + expect(solar.getMonth()).toBe(10); + expect(solar.getDay()).toBe(4); }); test('addDays8', () => { - var ymd = SolarUtil.addDays(1582,11,1, -17); - expect(ymd.year).toBe(1582); - expect(ymd.month).toBe(10); - expect(ymd.day).toBe(15); + var solar = Solar.fromYmd(1582,11,1).next(-17); + expect(solar.getYear()).toBe(1582); + expect(solar.getMonth()).toBe(10); + expect(solar.getDay()).toBe(15); }); test('getDaysBetween', () => { @@ -82,11 +82,11 @@ test('getDaysBetween2', () => { }); test('getWeek', () => { - var week = SolarUtil.getWeek(1582, 10, 1); + var week = Solar.fromYmd(1582, 10, 1).getWeek(); expect(week).toBe(1); }); test('getWeek1', () => { - var week = SolarUtil.getWeek(1582, 10, 15); + var week = Solar.fromYmd(1582, 10, 15).getWeek(); expect(week).toBe(5); }); diff --git a/lunar.js b/lunar.js index b500b17..7d7129d 100644 --- a/lunar.js +++ b/lunar.js @@ -10,71 +10,6 @@ } } })(this,function(){ - var ExactDate = (function(){ - return { - _:function(date,y,m,d){ - if(y<100){ - date.setFullYear(y); - date.setMonth(m-1); - date.setDate(d); - } - date.setMilliseconds(0); - return date; - }, - fromYmd:function(y,m,d){ - return this.fromYmdHms(y,m,d,0,0,0); - }, - fromYmdHms:function(y,m,d,hour,minute,second){ - return this._(new Date(y+'/'+m+'/'+d+' '+hour+':'+minute+':'+second),y,m,d); - }, - getDaysBetweenYmd:function(ay, am, ad, by, bm, bd){ - return SolarUtil.getDaysBetween(ay, am, ad, by, bm, bd); - }, - getDaysBetween:function(date0, date1){ - return SolarUtil.getDaysBetween(date0.getFullYear(), date0.getMonth() + 1, date0.getDate(), date1.getFullYear(), date1.getMonth() + 1, date1.getDate()); - }, - createDay:function(y, m, d){ - return { - year: y, - month: m, - day: d, - isAfter: function(day) { - if (this.year > day.year) { - return true; - } else if (this.year < day.year) { - return false; - } - if (this.month > day.month) { - return true; - } else if (this.month < day.month) { - return false; - } - return this.day > day.day; - }, - isBefore: function(day) { - if (this.year > day.year) { - return false; - } else if (this.year < day.year) { - return true; - } - if (this.month > day.month) { - return false; - } else if (this.month < day.month) { - return true; - } - return this.day < day.day; - }, - equals: function(day) { - return this.year == day.year && this.month == day.month && this.day == day.day; - }, - next: function(days) { - var date = SolarUtil.addDays(this.year, this.month, this.day, days); - return ExactDate.createDay(date.year, date.month, date.day); - } - } - } - }; - })(); var Solar = (function(){ var _fromDate = function(date){ return _fromYmdHms(date.getFullYear(),date.getMonth()+1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds()); @@ -122,11 +57,50 @@ return _fromYmdHms(year,month,day,hour,minute,second); }; var _fromYmdHms = function(y,m,d,hour,minute,second){ - if(1582==y && 10==m){ + var oy = y; + var om = m; + var od = d; + var oh = hour; + var oi = minute; + var os = second; + y *= 1; + if(isNaN(y)){ + throw new Error('wrong solar year '+oy); + } + m *= 1; + if(isNaN(m)){ + throw new Error('wrong solar month '+om); + } + d *= 1; + if(isNaN(d)){ + throw new Error('wrong solar day '+od); + } + hour *= 1; + if(isNaN(hour)){ + throw new Error('wrong hour '+oh); + } + minute *= 1; + if(isNaN(minute)){ + throw new Error('wrong minute '+oi); + } + second *= 1; + if(isNaN(second)){ + throw new Error('wrong second '+os); + } + if(1582===y && 10===m){ if(d>4&&d<15){ - throw 'wrong solar year '+y+' month '+m+' day '+d; + throw new Error('wrong solar year '+y+' month '+m+' day '+d); } } + if(hour<0||hour>23){ + throw new Error('wrong hour '+hour); + } + if(minute<0||minute>59){ + throw new Error('wrong minute '+minute); + } + if(second<0||second>59){ + throw new Error('wrong second '+second); + } return { _p:{ year:y, @@ -134,8 +108,78 @@ day:d, hour:hour, minute:minute, - second:second, - calendar:ExactDate.fromYmdHms(y,m,d,hour,minute,second) + second:second + }, + subtract:function(solar){ + return SolarUtil.getDaysBetween(solar.getYear(), solar.getMonth(), solar.getDay(), this._p.year, this._p.month, this._p.day); + }, + subtractMinute:function(solar){ + var days = this.subtract(solar); + var cm = this._p.hour * 60 + this._p.minute; + var sm = solar.getHour() * 60 + solar.getMinute(); + var m = cm - sm; + if (m < 0) { + m += 1440; + days--; + } + m += days * 1440; + return m; + }, + isAfter: function(solar) { + if (this._p.year > solar.getYear()) { + return true; + } else if (this._p.year < solar.getYear()) { + return false; + } + if (this._p.month > solar.getMonth()) { + return true; + } else if (this._p.month < solar.getMonth()) { + return false; + } + if (this._p.day > solar.getDay()) { + return true; + } else if (this._p.day < solar.getDay()) { + return false; + } + if (this._p.hour > solar.getHour()) { + return true; + } else if (this._p.hour < solar.getHour()) { + return false; + } + if (this._p.minute > solar.getMinute()) { + return true; + } else if (this._p.minute < solar.getMinute()) { + return false; + } + return this._p.second > solar.getSecond(); + }, + isBefore: function(solar) { + if (this._p.year > solar.getYear()) { + return false; + } else if (this._p.year < solar.getYear()) { + return true; + } + if (this._p.month > solar.getMonth()) { + return false; + } else if (this._p.month < solar.getMonth()) { + return true; + } + if (this._p.day > solar.getDay()) { + return false; + } else if (this._p.day < solar.getDay()) { + return true; + } + if (this._p.hour > solar.getHour()) { + return false; + } else if (this._p.hour < solar.getHour()) { + return true; + } + if (this._p.minute > solar.getMinute()) { + return false; + } else if (this._p.minute < solar.getMinute()) { + return true; + } + return this._p.second < solar.getSecond(); }, getYear:function(){ return this._p.year; @@ -156,7 +200,26 @@ return this._p.second; }, getWeek:function(){ - return SolarUtil.getWeek(this._p.year, this._p.month, this._p.day); + var start = _fromYmdHms(1582, 10, 15, 0, 0, 0); + var y = this._p.year; + var m = this._p.month; + var d = this._p.day; + var current = _fromYmdHms(y, m, d, 0, 0, 0); + // 蔡勒公式 + if (m < 3) { + m += 12; + y--; + } + var c = Math.floor(y/100); + y = y - c * 100; + var x = y + Math.floor(y/4) + Math.floor(c/4) - 2*c; + var w; + if (current.isBefore(start)) { + w = (x + Math.floor((13*(m+1))/5) + d + 2) % 7; + } else { + w = (x + Math.floor((26*(m+1))/10) + d - 1) % 7; + } + return (w + 7) % 7; }, getWeekInChinese:function(){ return SolarUtil.WEEK[this.getWeek()]; @@ -166,7 +229,7 @@ * @param start 星期几作为一周的开始,1234560分别代表星期一至星期天 */ getSolarWeek:function(start){ - return SolarWeek.fromDate(this._p.calendar,start); + return SolarWeek.fromYmd(this._p.year, this._p.month, this._p.day, start); }, isLeapYear:function(){ return SolarUtil.isLeapYear(this._p.year); @@ -258,44 +321,162 @@ s += ' '+this.getXingZuo()+'座'; return s; }, - next:function(days, onlyWorkday){ - var y = this._p.year; + nextYear:function(years){ + var oy = years; + years *= 1; + if (isNaN(years)) { + throw new Error('wrong years ' + oy); + } + var y = this._p.year + years; var m = this._p.month; var d = this._p.day; - if(0 != days){ - if (!onlyWorkday){ - var ymd = SolarUtil.addDays(y, m, d, days); - y = ymd.year; - m = ymd.month; - d = ymd.day; - }else{ - var rest = Math.abs(days); - var add = days < 1 ? -1 : 1; - while(rest > 0){ - var ymd = SolarUtil.addDays(y, m, d, add); - var work = true; - y = ymd.year; - m = ymd.month; - d = ymd.day; - var holiday = HolidayUtil.getHoliday(y, m, d); - if(!holiday){ - var week = SolarUtil.getWeek(y, m, d); - if(0 === week || 6 === week){ - work = false; - } - }else{ - work = holiday.isWork(); - } - if(work){ - rest--; + // 2月处理 + if (2 === m) { + if (d > 28) { + if (!SolarUtil.isLeapYear(y)) { + d -= 28; + m++; + if (m > 12) { + m = 1; + y++; } } } } - return _fromYmdHms(y, m, d, this._p.hour,this._p.minute,this._p.second); + if (1582 === y && 10 === m) { + if (d > 4 && d < 15) { + d += 10; + } + } + return _fromYmdHms(y, m, d, this._p.hour, this._p.minute, this._p.second); + }, + nextMonth:function(months){ + var om = months; + months *= 1; + if (isNaN(months)) { + throw new Error('wrong months ' + om); + } + var month = SolarMonth.fromYm(this._p.year, this._p.month); + month = month.next(months); + var y = month.getYear(); + var m = month.getMonth(); + var d = this._p.day; + // 2月处理 + if (2 === m) { + if (d > 28) { + if (!SolarUtil.isLeapYear(y)) { + d -= 28; + m++; + if (m > 12) { + m = 1; + y++; + } + } + } + } + if (1582 === y && 10 === m) { + if (d > 4 && d < 15) { + d += 10; + } + } + return _fromYmdHms(y, m, d, this._p.hour, this._p.minute, this._p.second); + }, + nextDay:function(days){ + var od = days; + days *= 1; + if (isNaN(days)) { + throw new Error('wrong days ' + od); + } + var y = this._p.year; + var m = this._p.month; + var d = this._p.day; + if (days > 0) { + d = this._p.day + days; + var daysInMonth = SolarUtil.getDaysOfMonth(y, m); + while (d > daysInMonth) { + d -= daysInMonth; + m++; + if (m > 12) { + m -= 12; + y++; + } + daysInMonth = SolarUtil.getDaysOfMonth(y, m); + } + } else if (days < 0) { + var rest = -days; + while (d <= rest) { + rest -= d; + m--; + if (m < 1) { + m = 12; + y--; + } + d = SolarUtil.getDaysOfMonth(y, m); + } + d -= rest; + } + if (1582 === y && 10 === m) { + if (d > 4 && d < 15) { + d += 10; + } + } + return _fromYmdHms(y, m, d, this._p.hour, this._p.minute, this._p.second); + }, + nextWorkday:function(days){ + var od = days; + days *= 1; + if (isNaN(days)) { + throw new Error('wrong days ' + od); + } + var solar = _fromYmdHms(this._p.year, this._p.month, this._p.day, this._p.hour, this._p.minute, this._p.second); + if (days !== 0) { + var rest = Math.abs(days); + var add = days < 1 ? -1 : 1; + while (rest > 0) { + solar = solar.next(add); + var work = true; + var holiday = HolidayUtil.getHoliday(solar.getYear(), solar.getMonth(), solar.getDay()); + if (!holiday) { + var week = solar.getWeek(); + if (0 === week || 6 === week) { + work = false; + } + } else { + work = holiday.isWork(); + } + if (work) { + rest -= 1; + } + } + } + return solar; + }, + next:function(days, onlyWorkday){ + if (onlyWorkday) { + return this.nextWorkday(days); + } + return this.nextDay(days); + }, + nextHour:function(hours){ + var oh = hours; + hours *= 1; + if (isNaN(hours)) { + throw new Error('wrong hours ' + oh); + } + var h = this._p.hour + hours; + var n = h < 0 ? -1 : 1; + var hour = Math.abs(h); + var days = Math.floor(hour / 24) * n; + hour = (hour % 24) * n; + if (hour < 0) { + hour += 24; + days--; + } + var solar = this.next(days); + return _fromYmdHms(solar.getYear(), solar.getMonth(), solar.getDay(), hour, solar.getMinute(), solar.getSecond()); }, getLunar:function(){ - return Lunar.fromDate(this._p.calendar); + return Lunar.fromSolar(this); }, getJulianDay:function(){ var y = this._p.year; @@ -315,21 +496,22 @@ n = 2 - n + Math.floor(n / 4); } return Math.floor(365.25 * (y + 4716)) + Math.floor(30.6001 * (m + 1)) + d + n - 1524.5; - }, - getCalendar:function(){ - return this._p.calendar; } }; }; var _fromBaZi=function(yearGanZhi,monthGanZhi,dayGanZhi,timeGanZhi,sect,baseYear){ - sect = (1==sect)?1:2; - baseYear = (undefined==baseYear)?1900:baseYear; + sect *= 1; + if(isNaN(sect)){ + sect=2; + } + sect = (1===sect)?1:2; + baseYear = (undefined===baseYear)?1900:baseYear; var l = []; var years = []; var today = _fromDate(new Date()); var offsetYear = LunarUtil.getJiaZiIndex(today.getLunar().getYearInGanZhiExact())-LunarUtil.getJiaZiIndex(yearGanZhi); if(offsetYear<0){ - offsetYear = offsetYear+60; + offsetYear += 60; } var startYear = today.getYear() - offsetYear - 1; while (startYear >= baseYear) { @@ -347,9 +529,9 @@ inner:for (var x = 0; x < 3; x++) { var year = years[i] + x; var solar = _fromYmdHms(year, 1, 1, hour, 0, 0); - while (solar.getYear() == year) { + while (solar.getYear() === year) { var lunar = solar.getLunar(); - var dgz = (2==sect)?lunar.getDayInGanZhiExact2():lunar.getDayInGanZhiExact(); + var dgz = (2===sect)?lunar.getDayInGanZhiExact2():lunar.getDayInGanZhiExact(); if (lunar.getYearInGanZhiExact()===yearGanZhi && lunar.getMonthInGanZhiExact()===monthGanZhi && dgz===dayGanZhi && lunar.getTimeInGanZhi()===timeGanZhi) { l.push(solar); break inner; @@ -408,7 +590,7 @@ //获取立春的阳历时刻 var liChun = o['jieQi']['立春']; - if (liChun.getYear() != solarYear) { + if (liChun.getYear() !== solarYear) { liChun = o['jieQi']['LI_CHUN']; } var liChunYmd = liChun.toYmd(); @@ -526,20 +708,17 @@ _computeWeek(o, solar); return o; }; - var _fromDate = function(date){ - var currentYear = date.getFullYear(); - var currentMonth = date.getMonth() + 1; - var currentDay = date.getDate(); + var _fromSolar = function(solar){ var lunarYear = 0; var lunarMonth = 0; var lunarDay = 0; - var ly = LunarYear.fromYear(currentYear); + var ly = LunarYear.fromYear(solar.getYear()); var lms = ly.getMonths(); for (var i = 0, j = lms.length; i < j; i++) { var m = lms[i]; // 初一 var firstDay = Solar.fromJulianDay(m.getFirstJulianDay()); - var days = ExactDate.getDaysBetweenYmd(firstDay.getYear(), firstDay.getMonth(), firstDay.getDay(), currentYear, currentMonth, currentDay); + var days = solar.subtract(firstDay); if (days < m.getDayCount()) { lunarYear = m.getYear(); lunarMonth = m.getMonth(); @@ -547,20 +726,62 @@ break; } } - return _new(lunarYear, lunarMonth, lunarDay, date.getHours(), date.getMinutes(), date.getSeconds(), Solar.fromDate(date), ly); + return _new(lunarYear, lunarMonth, lunarDay, solar.getHour(), solar.getMinute(), solar.getSecond(), solar, ly); + }; + var _fromDate = function(date){ + return _fromSolar(Solar.fromDate(date)); }; var _fromYmdHms = function(lunarYear,lunarMonth,lunarDay,hour,minute,second) { + var oy = lunarYear; + var om = lunarMonth; + var od = lunarDay; + var oh = hour; + var oi = minute; + var os = second; + lunarYear *= 1; + if(isNaN(lunarYear)){ + throw new Error('wrong lunar year '+oy); + } + lunarMonth *= 1; + if(isNaN(lunarMonth)){ + throw new Error('wrong lunar month '+om); + } + lunarDay *= 1; + if(isNaN(lunarDay)){ + throw new Error('wrong lunar day '+od); + } + hour *= 1; + if(isNaN(hour)){ + throw new Error('wrong hour '+oh); + } + minute *= 1; + if(isNaN(minute)){ + throw new Error('wrong minute '+oi); + } + second *= 1; + if(isNaN(second)){ + throw new Error('wrong second '+os); + } + if(hour<0||hour>23){ + throw new Error('wrong hour '+hour); + } + if(minute<0||minute>59){ + throw new Error('wrong minute '+minute); + } + if(second<0||second>59){ + throw new Error('wrong second '+second); + } var y = LunarYear.fromYear(lunarYear); var m = y.getMonth(lunarMonth); if (null == m) { - throw 'wrong lunar year '+lunarYear+' month '+lunarMonth; + throw new Error('wrong lunar year '+lunarYear+' month '+lunarMonth); } if (lunarDay < 1) { - throw 'lunar day must bigger than 0'; + throw new Error('lunar day must bigger than 0'); } var days = m.getDayCount(); if (lunarDay > days) { - throw 'only '+days+' days in lunar year '+lunarYear+' month '+lunarMonth; + throw new Error('only '+days+' days in lunar year '+lunarYear+' month '+lunarMonth); } var noon = Solar.fromJulianDay(m.getFirstJulianDay() + lunarDay - 1); var solar = Solar.fromYmdHms(noon.getYear(), noon.getMonth(), noon.getDay(), hour, minute, second); @@ -777,7 +998,7 @@ return LunarUtil.POSITION_DESC[this.getTimePositionCai()]; }, _getDayPositionTaiSui:function(dayInGanZhi, yearZhiIndex){ - var p = ''; + var p; switch (dayInGanZhi) { case '甲子': case '乙丑': @@ -846,7 +1067,7 @@ return LunarUtil.POSITION_DESC[this.getDayPositionTaiSui(sect)]; }, _getMonthPositionTaiSui:function(monthZhiIndex, monthGanIndex){ - var p = ''; + var p; var m = monthZhiIndex - LunarUtil.BASE_MONTH_ZHI_INDEX; if (m < 0) { m += 12; @@ -1200,10 +1421,18 @@ return LunarUtil.POSITION_TAI_MONTH[m-1]; }, getDayYi:function(sect){ - return LunarUtil.getDayYi(2 == sect ? this.getMonthInGanZhiExact() : this.getMonthInGanZhi(), this.getDayInGanZhi()); + sect *= 1; + if(isNaN(sect)){ + sect = 2; + } + return LunarUtil.getDayYi(2 === sect ? this.getMonthInGanZhiExact() : this.getMonthInGanZhi(), this.getDayInGanZhi()); }, getDayJi:function(sect){ - return LunarUtil.getDayJi(2 == sect ? this.getMonthInGanZhiExact() : this.getMonthInGanZhi(), this.getDayInGanZhi()); + sect *= 1; + if(isNaN(sect)){ + sect = 2; + } + return LunarUtil.getDayJi(2 === sect ? this.getMonthInGanZhiExact() : this.getMonthInGanZhi(), this.getDayInGanZhi()); }, getDayJiShen:function(){ return LunarUtil.getDayJiShen(this.getMonth(),this.getDayInGanZhi()); @@ -1308,13 +1537,13 @@ var solarNiZiYmd = solarNiZi.toYmd(); var offset = 0; if (solarYmd >= solarShunBaiYmd && solarYmd < solarNiZiYmd) { - offset = ExactDate.getDaysBetween(solarShunBai.getCalendar(), this.getSolar().getCalendar()) % 9; + offset = this._p.solar.subtract(solarShunBai) % 9; } else if (solarYmd >= solarNiZiYmd && solarYmd < solarShunBaiYmd2){ - offset = 8 - (ExactDate.getDaysBetween(solarNiZi.getCalendar(), this.getSolar().getCalendar()) % 9); + offset = 8 - (this._p.solar.subtract(solarNiZi) % 9); } else if (solarYmd >= solarShunBaiYmd2) { - offset = ExactDate.getDaysBetween(solarShunBai2.getCalendar(), this.getSolar().getCalendar()) % 9; + offset = this._p.solar.subtract(solarShunBai2) % 9; } else if (solarYmd < solarShunBaiYmd) { - offset = (8 + ExactDate.getDaysBetween(this.getSolar().getCalendar(), solarShunBai.getCalendar())) % 9; + offset = (8 + solarShunBai.subtract(this._p.solar)) % 9; } return NineStar.fromIndex(offset); }, @@ -1376,9 +1605,7 @@ _buildJieQi:function(name, solar){ var jie=false; var qi=false; - var i; - var j; - for(i=0,j=Lunar.JIE_QI.length;i 2) { index = 2; @@ -1690,15 +1917,13 @@ }, getHou:function(){ var jieQi = this.getPrevJieQi(true); - var name = jieQi.getName(); - var startSolar = jieQi.getSolar(); - var days = ExactDate.getDaysBetweenYmd(startSolar.getYear(),startSolar.getMonth(),startSolar.getDay(), this._p.solar.getYear(),this._p.solar.getMonth(),this._p.solar.getDay()); + var days = this._p.solar.subtract(jieQi.getSolar()); var max = LunarUtil.HOU.length - 1; var offset = Math.floor(days / 5); if (offset > max) { offset = max; } - return name + ' ' + LunarUtil.HOU[offset]; + return jieQi.getName() + ' ' + LunarUtil.HOU[offset]; }, getDayLu:function(){ var gan = LunarUtil.LU[this.getDayGan()]; @@ -1726,14 +1951,35 @@ JIE_QI_IN_USE: ['DA_XUE', '冬至', '小寒', '大寒', '立春', '雨水', '惊蛰', '春分', '清明', '谷雨', '立夏', '小满', '芒种', '夏至', '小暑', '大暑', '立秋', '处暑', '白露', '秋分', '寒露', '霜降', '立冬', '小雪', '大雪', 'DONG_ZHI', 'XIAO_HAN', 'DA_HAN', 'LI_CHUN', 'YU_SHUI', 'JING_ZHE'], fromYmdHms:function(y,m,d,hour,minute,second){return _fromYmdHms(y,m,d,hour,minute,second);}, fromYmd:function(y,m,d){return _fromYmdHms(y,m,d,0,0,0);}, + fromSolar:function(solar){return _fromSolar(solar);}, fromDate:function(date){return _fromDate(date);} }; })(); var SolarWeek = (function(){ var _fromDate = function(date,start){ - return _fromYmd(date.getFullYear(),date.getMonth()+1,date.getDate(),start); + var solar = Solar.fromDate(date); + return _fromYmd(solar.getYear(),solar.getMonth(), solar.getDay(), start); }; var _fromYmd = function(y,m,d,start){ + var oy = y; + var om = m; + var od = d; + y *= 1; + if(isNaN(y)){ + throw new Error('wrong solar year '+oy); + } + m *= 1; + if(isNaN(m)){ + throw new Error('wrong solar month '+om); + } + d *= 1; + if(isNaN(d)){ + throw new Error('wrong solar day '+od); + } + start *= 1; + if(isNaN(start)){ + start = 0; + } return { _p:{ year:y, @@ -1758,7 +2004,7 @@ * @return number 周序号,从1开始 */ getIndex:function(){ - var firstDayWeek = SolarUtil.getWeek(this._p.year,this._p.month,1); + var firstDayWeek = Solar.fromYmd(this._p.year,this._p.month,1).getWeek(); var offset = firstDayWeek - this._p.start; if(offset < 0) { offset += 7; @@ -1770,7 +2016,7 @@ * @return number 周序号,从1开始 */ getIndexInYear:function(){ - var firstDayWeek = SolarUtil.getWeek(this._p.year,1,1); + var firstDayWeek = Solar.fromYmd(this._p.year,1,1).getWeek(); var offset = firstDayWeek - this._p.start; if(offset < 0) { offset += 7; @@ -1783,70 +2029,69 @@ * @param separateMonth 是否按月单独计算 * @return object 推移后的阳历周 */ - next:function(weeks,separateMonth){ - var date = {}; - date.year = this._p.year; - date.month = this._p.month; - date.day = this._p.day; - var start = this._p.start; - if (0 != weeks) { - if(separateMonth){ - var n = weeks; - var week = _fromYmd(date.year, date.month, date.day, start); - var month = this._p.month; - var plus = n>0; - while(0 !== n){ - date = SolarUtil.addDays(date.year, date.month, date.day, plus ? 7 : -7); - week = _fromYmd(date.year, date.month, date.day, start); - var weekMonth = week.getMonth(); - if(month !== weekMonth){ - var index = week.getIndex(); - if(plus){ - if(1 === index){ - var firstDay = week.getFirstDay(); - week = _fromYmd(firstDay.getYear(), firstDay.getMonth(), firstDay.getDay(), start); - weekMonth = week.getMonth(); - }else{ - date.year = week.getYear(); - date.month = week.getMonth(); - date.day = 1; - week = _fromYmd(date.year, date.month, date.day, start); - } - }else{ - var size = SolarUtil.getWeeksOfMonth(week.getYear(),week.getMonth(),this._p.start); - if(size===index){ - var lastDay = week.getFirstDay().next(6); - week = _fromYmd(lastDay.getYear(),lastDay.getMonth(),lastDay.getDay(),this._p.start); - weekMonth = week.getMonth(); - }else{ - date.year = week.getYear(); - date.month = week.getMonth(); - date.day = SolarUtil.getDaysOfMonth(week.getYear(),week.getMonth()); - week = _fromYmd(date.year, date.month, date.day, start); - } - } - month = weekMonth; - } - n -= plus ? 1 : -1; - } - return week; - }else{ - date = SolarUtil.addDays(date.year, date.month, date.day, weeks*7); - } + next: function (weeks, separateMonth) { + var ow = weeks; + weeks *= 1; + if(isNaN(weeks)){ + throw new Error('wrong weeks ' + ow); + } + var start = this._p.start; + if (0 === weeks) { + return _fromYmd(this._p.year, this._p.month, this._p.day, start); + } + var solar = Solar.fromYmd(this._p.year, this._p.month, this._p.day); + if (separateMonth) { + var n = weeks; + var week = _fromYmd(this._p.year, this._p.month, this._p.day, start); + var month = this._p.month; + var plus = n > 0; + while (0 !== n) { + solar = solar.next(plus ? 7 : -7); + week = _fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), start); + var weekMonth = week.getMonth(); + if (month !== weekMonth) { + var index = week.getIndex(); + if (plus) { + if (1 === index) { + var firstDay = week.getFirstDay(); + week = _fromYmd(firstDay.getYear(), firstDay.getMonth(), firstDay.getDay(), start); + weekMonth = week.getMonth(); + } else { + solar = Solar.fromYmd(week.getYear(), week.getMonth(), 1); + week = _fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), start); + } + } else { + var size = SolarUtil.getWeeksOfMonth(week.getYear(), week.getMonth(), this._p.start); + if (size === index) { + var lastDay = week.getFirstDay().next(6); + week = _fromYmd(lastDay.getYear(), lastDay.getMonth(), lastDay.getDay(), this._p.start); + weekMonth = week.getMonth(); + } else { + solar = Solar.fromYmd(week.getYear(), week.getMonth(), SolarUtil.getDaysOfMonth(week.getYear(), week.getMonth())); + week = _fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), start); + } + } + month = weekMonth; + } + n -= plus ? 1 : -1; + } + return week; + } else { + solar = solar.next(weeks * 7); + return _fromYmd(solar.getYear(), solar.getMonth(), solar.getDay(), start); } - return _fromYmd(date.year, date.month, date.day, start); }, /** * 获取本周第一天的阳历日期(可能跨月) * @return object 本周第一天的阳历日期 */ getFirstDay:function(){ - var prev = SolarUtil.getWeek(this._p.year,this._p.month,this._p.day)-this._p.start; + var solar = Solar.fromYmd(this._p.year, this._p.month, this._p.day); + var prev = solar.getWeek() - this._p.start; if(prev < 0){ prev += 7; } - var ymd = SolarUtil.addDays(this._p.year,this._p.month,this._p.day, -prev); - return Solar.fromYmd(ymd.year, ymd.month, ymd.day); + return solar.next(-prev); }, /** * 获取本周第一天的阳历日期(仅限当月) @@ -1921,9 +2166,20 @@ })(); var SolarMonth = (function(){ var _fromDate = function(date){ - return _fromYm(date.getFullYear(),date.getMonth()+1); + var solar = Solar.fromDate(date); + return _fromYm(solar.getYear(),solar.getMonth()); }; var _fromYm = function(y,m){ + var oy = y; + var om = m; + y *= 1; + if(isNaN(y)){ + throw new Error('wrong solar year '+oy); + } + m *= 1; + if(isNaN(m)){ + throw new Error('wrong solar month '+om); + } return { _p:{ year:y, @@ -1936,9 +2192,23 @@ return this._p.month; }, next:function(months){ - var date = ExactDate.fromYmd(this._p.year,this._p.month,1); - date.setMonth(date.getMonth()+months); - return _fromDate(date); + var om = months; + months *= 1; + if(isNaN(months)){ + throw new Error('wrong months ' + om); + } + var n = months < 0 ? -1 : 1; + var m = Math.abs(months); + var y = this._p.year + Math.floor(m / 12) * n; + m = this._p.month + m % 12 * n; + if (m > 12) { + m -= 12; + y++; + } else if (m < 1) { + m += 12; + y--; + } + return _fromYm(y, m); }, getDays:function(){ var l = []; @@ -1951,6 +2221,10 @@ return l; }, getWeeks:function(start){ + start *= 1; + if(isNaN(start)){ + start = 0; + } var l = []; var week = SolarWeek.fromYmd(this._p.year, this._p.month, 1, start); while (true) { @@ -1978,9 +2252,20 @@ })(); var SolarSeason = (function(){ var _fromDate = function(date){ - return _fromYm(date.getFullYear(),date.getMonth()+1); + var solar = Solar.fromDate(date); + return _fromYm(solar.getYear(),solar.getMonth()); }; var _fromYm = function(y,m){ + var oy = y; + var om = m; + y *= 1; + if(isNaN(y)){ + throw new Error('wrong solar year '+oy); + } + m *= 1; + if(isNaN(m)){ + throw new Error('wrong solar month '+om); + } return { _p:{ year:y, @@ -2005,12 +2290,14 @@ * @return object 推移后的季度 */ next:function(seasons){ - if(0===seasons){ - return _fromYm(this._p.year,this._p.month); + var os = seasons; + seasons *= 1; + if(isNaN(seasons)){ + throw new Error('wrong seasons ' + os); } - var date = ExactDate.fromYmd(this._p.year,this._p.month,1); - date.setMonth(date.getMonth()+3*seasons); - return _fromDate(date); + var month = SolarMonth.fromYm(this._p.year, this._p.month); + month = month.next(3 * seasons); + return _fromYm(month.getYear(), month.getMonth()); }, /** * 获取本季度的月份 @@ -2039,9 +2326,20 @@ })(); var SolarHalfYear = (function(){ var _fromDate = function(date){ - return _fromYm(date.getFullYear(),date.getMonth()+1); + var solar = Solar.fromDate(date); + return _fromYm(solar.getYear(),solar.getMonth()); }; var _fromYm = function(y,m){ + var oy = y; + var om = m; + y *= 1; + if(isNaN(y)){ + throw new Error('wrong solar year '+oy); + } + m *= 1; + if(isNaN(m)){ + throw new Error('wrong solar month '+om); + } return { _p:{ year:y, @@ -2066,12 +2364,14 @@ * @return object 推移后的半年 */ next:function(halfYears){ - if(0===halfYears){ - return _fromYm(this._p.year,this._p.month); + var oh = halfYears; + halfYears *= 1; + if(isNaN(halfYears)){ + throw new Error('wong halfYears ' + oh); } - var date = ExactDate.fromYmd(this._p.year,this._p.month,1); - date.setMonth(date.getMonth()+6*halfYears); - return _fromDate(date); + var month = SolarMonth.fromYm(this._p.year, this._p.month); + month = month.next(6 * halfYears); + return _fromYm(month.getYear(), month.getMonth()); }, /** * 获取本半年的月份 @@ -2100,9 +2400,14 @@ })(); var SolarYear = (function(){ var _fromDate = function(date){ - return _fromYear(date.getFullYear()); + return _fromYear(Solar.fromDate(date).getYear()); }; var _fromYear = function(y){ + var oy = y; + y *= 1; + if(isNaN(y)){ + throw new Error('wrong solar year '+oy); + } return { _p:{ year:y @@ -2111,9 +2416,12 @@ return this._p.year; }, next:function(years){ - var date = ExactDate.fromYmd(this._p.year,1,1); - date.setFullYear(date.getFullYear()+years); - return _fromDate(date); + var oy = years; + years *= 1; + if(isNaN(years)){ + throw new Error('wrong years ' + oy); + } + return _fromYear(this._p.year + years); }, getMonths:function(){ var l = []; @@ -2156,6 +2464,11 @@ }; _initLeap(); var _fromYear = function(lunarYear){ + var oy = lunarYear; + lunarYear *= 1; + if(isNaN(lunarYear)){ + throw new Error('wrong lunar year '+oy); + } var _y = (function(){ var offset = lunarYear - 4; var yearGanIndex = offset % 10; @@ -2188,6 +2501,11 @@ getJieQiJulianDays:function(){return this._p.jieQiJulianDays;}, getMonths:function(){return this._p.months;}, getMonth:function(lunarMonth){ + var om = lunarMonth; + lunarMonth *= 1; + if(isNaN(lunarMonth)){ + throw new Error('wrong lunarMonth ' + om); + } for (var i = 0, j = this._p.months.length; i < j; i++) { var m = this._p.months[i]; if (m.getYear() === this._p.year && m.getMonth() === lunarMonth) { @@ -2318,8 +2636,13 @@ toFullString:function(){ return this.getYear()+'年'; }, - next:function(n){ - return LunarYear.fromYear(this._p.year + n); + next:function(years){ + var oy = years; + years *= 1; + if(isNaN(years)){ + throw new Error('wrong years ' + oy); + } + return LunarYear.fromYear(this._p.year + years); }, _compute:function(){ this._p.months = []; @@ -2419,6 +2742,16 @@ })(); var LunarMonth = (function(){ var _fromYm = function(lunarYear,lunarMonth){ + var oy = lunarYear; + var om = lunarMonth; + lunarYear *= 1; + if(isNaN(lunarYear)){ + throw new Error('wrong lunar year '+oy); + } + lunarMonth *= 1; + if(isNaN(lunarMonth)){ + throw new Error('wrong lunar month '+om); + } return LunarYear.fromYear(lunarYear).getMonth(lunarMonth); }; var _new = function(lunarYear, lunarMonth, dayCount, firstJulianDay){ @@ -2435,7 +2768,7 @@ getFirstJulianDay:function(){return this._p.firstJulianDay;}, isLeap:function(){return this._p.month<0;}, getPositionTaiSui:function(){ - var p = ''; + var p; var m = Math.abs(this._p.month); switch(m) { case 1: @@ -2476,7 +2809,12 @@ return NineStar.fromIndex(offset); }, next:function(n){ - if (0 == n) { + var on = n; + n *= 1; + if(isNaN(n)){ + throw new Error('wrong days ' + on); + } + if (0 === n) { return LunarMonth.fromYm(this._p.year, this._p.month); } else { var rest = Math.abs(n); @@ -2591,7 +2929,7 @@ m = n2; } else { m = Math.floor((3 * n * n0 / m0 + 0.5) + n1); - if (i != 0) { + if (i !== 0) { m += 3; } if (m > n2) { @@ -2795,7 +3133,17 @@ WEEK_FESTIVAL:{'3-0-1':'全国中小学生安全教育日','5-2-0':'母亲节','6-3-0':'父亲节','11-4-4':'感恩节'}, isLeapYear:function(year){return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);}, getDaysOfMonth:function(year, month){ - if (1582 == year && 10 == month) { + var oy = year; + var om = month; + year *= 1; + if(isNaN(year)){ + throw new Error('wrong solar year '+oy); + } + month *= 1; + if(isNaN(month)){ + throw new Error('wrong solar month '+om); + } + if (1582 === year && 10 === month) { return 21; } var m = month-1; @@ -2806,32 +3154,83 @@ return d; }, getDaysOfYear:function(year){ - if (1582 == year) { + var oy = year; + year *= 1; + if(isNaN(year)){ + throw new Error('wrong solar year '+oy); + } + if (1582 === year) { return 355; } return this.isLeapYear(year) ? 366: 365; }, getDaysInYear:function(year, month, day){ + var oy = year; + var om = month; + var od = day; + year *= 1; + if(isNaN(year)){ + throw new Error('wrong solar year '+oy); + } + month *= 1; + if(isNaN(month)){ + throw new Error('wrong solar month '+om); + } + day *= 1; + if(isNaN(day)){ + throw new Error('wrong solar day '+od); + } var days = 0; for (var i = 1; i < month; i++) { days += this.getDaysOfMonth(year, i); } var d = day; - if (1582 == year && 10 == month) { + if (1582 === year && 10 === month) { if (day >= 15) { d -= 10; } else if (day > 4) { - throw 'wrong solar year '+year+' month '+month+' day '+day; + throw new Error('wrong solar year '+year+' month '+month+' day '+day); } } days += d; return days; }, getDaysBetween:function(ay, am, ad, by, bm, bd){ + var oay = ay; + var oam = am; + var oad = ad; + var oby = by; + var obm = bm; + var obd = bd; + ay *= 1; + if(isNaN(ay)){ + throw new Error('wrong solar year '+oay); + } + am *= 1; + if(isNaN(am)){ + throw new Error('wrong solar month '+oam); + } + ad *= 1; + if(isNaN(ad)){ + throw new Error('wrong solar day '+oad); + } + by *= 1; + if(isNaN(by)){ + throw new Error('wrong solar year '+oby); + } + bm *= 1; + if(isNaN(bm)){ + throw new Error('wrong solar month '+obm); + } + bd *= 1; + if(isNaN(bd)){ + throw new Error('wrong solar day '+obd); + } + var n; var days; var i; - if (ay == by) { + if (ay === by) { n = this.getDaysInYear(by, bm, bd) - this.getDaysInYear(ay, am, ad); } else if (ay > by) { days = this.getDaysOfYear(by) - this.getDaysInYear(by, bm, bd); @@ -2850,73 +3249,8 @@ } return n; }, - getWeek:function(y, m, d){ - if (1582 == y && 10 == m) { - if (d > 4 && d < 15) { - throw 'wrong solar year '+y+' month '+m+' day '+d; - } - } - var start = ExactDate.createDay(1582, 10, 15); - var current = ExactDate.createDay(y, m, d); - // 蔡勒公式 - if (m < 3) { - m += 12; - y--; - } - var c = Math.floor(y/100); - y = y - c * 100; - var w; - if (current.isBefore(start)) { - w = (y + Math.floor(y/4) + Math.floor(c/4) - 2*c + Math.floor((13*(m+1))/5) + d + 2) % 7; - } else { - w = (y + Math.floor(y/4) + Math.floor(c/4) - 2*c + Math.floor((26*(m+1))/10) + d - 1) % 7; - } - return (w + 7) % 7; - }, getWeeksOfMonth:function(year, month, start){ - var days = this.getDaysOfMonth(year, month); - var firstDayWeek = this.getWeek(year, month, 1); - return Math.ceil((days + firstDayWeek - start)/7); - }, - addDays:function(year, month, day, days){ - var y = year; - var m = month; - var d = day; - if(days > 0){ - d = day + days; - var daysInMonth = this.getDaysOfMonth(y,m); - while(d > daysInMonth){ - d -= daysInMonth; - m++; - if(m > 12){ - m-=12; - y++; - } - daysInMonth = this.getDaysOfMonth(y,m); - } - }else if(days < 0){ - var rest = -days; - while(d <= rest){ - rest -= d; - m--; - if(m < 1){ - m = 12; - y--; - } - d = this.getDaysOfMonth(y,m); - } - d -= rest; - } - if (1582 == y && 10 == m) { - if (d > 4) { - d += 10; - } - } - return { - year:y, - month:m, - day:d - }; + return Math.ceil((this.getDaysOfMonth(year, month) + Solar.fromYmd(year, month, 1).getWeek() - start)/7); } }; })(); @@ -3005,7 +3339,7 @@ }, getJiaZiIndex:function(ganZhi){ for(var i=0,j=this.JIA_ZI.length;i=_SIZE){ var segment = data.substr(0,_SIZE); var day = segment.substr(0,8); - var remove = _TAG_REMOVE == segment.substr(8, 1); + var remove = _TAG_REMOVE === segment.substr(8, 1); var holiday = _getHoliday([day]); if(!holiday){ if (!remove) { @@ -3511,10 +3845,13 @@ var _fromLunar=function(lunar){ return { _p:{sect:2,lunar:lunar}, - setSect:function(sect){this._p.sect=(1==sect)?1:2;}, + setSect:function(sect){ + sect *= 1; + this._p.sect=(1===sect)?1:2; + }, getSect:function(){return this._p.sect;}, - getDayGanIndex:function(){return 2==this._p.sect?this._p.lunar.getDayGanIndexExact2():this._p.lunar.getDayGanIndexExact();}, - getDayZhiIndex:function(){return 2==this._p.sect?this._p.lunar.getDayZhiIndexExact2():this._p.lunar.getDayZhiIndexExact();}, + getDayGanIndex:function(){return 2===this._p.sect?this._p.lunar.getDayGanIndexExact2():this._p.lunar.getDayGanIndexExact();}, + getDayZhiIndex:function(){return 2===this._p.sect?this._p.lunar.getDayZhiIndexExact2():this._p.lunar.getDayZhiIndexExact();}, getYear:function(){return this._p.lunar.getYearInGanZhiExact();}, getYearGan:function(){return this._p.lunar.getYearGanExact();}, getYearZhi:function(){return this._p.lunar.getYearZhiExact();}, @@ -3534,7 +3871,7 @@ }, _getDiShi:function(zhiIndex){ var offset = CHANG_SHENG_OFFSET[this.getDayGan()]; - var index = offset + (this.getDayGanIndex()%2==0?zhiIndex:-zhiIndex); + var index = offset + (this.getDayGanIndex()%2===0?zhiIndex:-zhiIndex); if(index>=12){ index -= 12; } @@ -3566,9 +3903,9 @@ getMonthDiShi:function(){return this._getDiShi(this._p.lunar.getMonthZhiIndexExact());}, getMonthXun:function(){return this._p.lunar.getMonthXunExact()}, getMonthXunKong:function(){return this._p.lunar.getMonthXunKongExact()}, - getDay:function(){return 2==this._p.sect?this._p.lunar.getDayInGanZhiExact2():this._p.lunar.getDayInGanZhiExact();}, - getDayGan:function(){return 2==this._p.sect?this._p.lunar.getDayGanExact2():this._p.lunar.getDayGanExact();}, - getDayZhi:function(){return 2==this._p.sect?this._p.lunar.getDayZhiExact2():this._p.lunar.getDayZhiExact();}, + getDay:function(){return 2===this._p.sect?this._p.lunar.getDayInGanZhiExact2():this._p.lunar.getDayInGanZhiExact();}, + getDayGan:function(){return 2===this._p.sect?this._p.lunar.getDayGanExact2():this._p.lunar.getDayGanExact();}, + getDayZhi:function(){return 2===this._p.sect?this._p.lunar.getDayZhiExact2():this._p.lunar.getDayZhiExact();}, getDayHideGan:function(){return LunarUtil.ZHI_HIDE_GAN[this.getDayZhi()];}, getDayWuXing:function(){return LunarUtil.WU_XING_GAN[this.getDayGan()]+LunarUtil.WU_XING_ZHI[this.getDayZhi()];}, getDayNaYin:function(){return LunarUtil.NAYIN[this.getDay()];}, @@ -3584,8 +3921,8 @@ return l; }, getDayDiShi:function(){return this._getDiShi(this.getDayZhiIndex());}, - getDayXun:function(){return 2==this._p.sect?this._p.lunar.getDayXunExact2():this._p.lunar.getDayXunExact()}, - getDayXunKong:function(){return 2==this._p.sect?this._p.lunar.getDayXunKongExact2():this._p.lunar.getDayXunKongExact()}, + getDayXun:function(){return 2===this._p.sect?this._p.lunar.getDayXunExact2():this._p.lunar.getDayXunExact()}, + getDayXunKong:function(){return 2===this._p.sect?this._p.lunar.getDayXunKongExact2():this._p.lunar.getDayXunKongExact()}, getTime:function(){return this._p.lunar.getTimeInGanZhi();}, getTimeGan:function(){return this._p.lunar.getTimeGan();}, getTimeZhi:function(){return this._p.lunar.getTimeZhi();}, @@ -3620,8 +3957,8 @@ getTaiYuanNaYin:function(){return LunarUtil.NAYIN[this.getTaiYuan()];}, getTaiXi:function(){ var lunar = this._p.lunar; - var ganIndex = (2 == this._p.sect) ? lunar.getDayGanIndexExact2() : lunar.getDayGanIndexExact(); - var zhiIndex = (2 == this._p.sect) ? lunar.getDayZhiIndexExact2() : lunar.getDayZhiIndexExact(); + var ganIndex = (2 === this._p.sect) ? lunar.getDayGanIndexExact2() : lunar.getDayGanIndexExact(); + var zhiIndex = (2 === this._p.sect) ? lunar.getDayZhiIndexExact2() : lunar.getDayZhiIndexExact(); return LunarUtil.HE_GAN_5[ganIndex]+LunarUtil.HE_ZHI_6[zhiIndex]; }, getTaiXiNaYin:function(){return LunarUtil.NAYIN[this.getTaiXi()];}, @@ -3679,7 +4016,8 @@ getShenGongNaYin:function(){return LunarUtil.NAYIN[this.getShenGong()];}, getLunar:function(){return this._p.lunar;}, getYun:function(gender, sect){ - sect = (2 == sect) ? sect : 1; + sect *= 1; + sect = (2 === sect) ? sect : 1; var lunar = this.getLunar(); var yang = 0 === lunar.getYearGanIndexExact() % 2; var man = 1 === gender; @@ -3697,7 +4035,7 @@ var hour = 0; if (2 === sect) { - var minutes = Math.floor((end.getCalendar() - start.getCalendar()) / 60000); + var minutes = end.subtractMinute(start); year = Math.floor(minutes / 4320); minutes -= year * 4320; month = Math.floor(minutes / 360); @@ -3711,7 +4049,7 @@ // 时辰差 var hourDiff = endTimeZhiIndex - startTimeZhiIndex; // 天数差 - var dayDiff = ExactDate.getDaysBetweenYmd(start.getYear(), start.getMonth(), start.getDay(), end.getYear(), end.getMonth(), end.getDay()); + var dayDiff = end.subtract(start); if (hourDiff < 0) { hourDiff += 12; dayDiff--; @@ -3919,13 +4257,11 @@ isForward: function(){return this._p.forward;}, getLunar: function(){return this._p.lunar;}, getStartSolar: function(){ - var birth = this._p.lunar.getSolar(); - var c = ExactDate.fromYmdHms(birth.getYear(), birth.getMonth(), birth.getDay(), birth.getHour(), birth.getMinute(), birth.getSecond()); - 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); + var solar = this._p.lunar.getSolar(); + solar = solar.nextYear(this._p.startYear); + solar = solar.nextMonth(this._p.startMonth); + solar = solar.next(this._p.startDay); + return solar.nextHour(this._p.startHour); }, getDaYun: function(n){ if (!n) { @@ -4060,7 +4396,7 @@ _p:{ name:name, result:result?result:'', - everyMonth:everyMonth?true:false, + everyMonth:!!everyMonth, remark:remark?remark:'' }, getName:function(){return this._p.name;}, diff --git a/package.json b/package.json index a0c40fb..6655ccc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lunar-javascript", - "version": "1.2.38", + "version": "1.3.0", "description": "lunar is a calendar library for Solar and Chinese Lunar.", "main": "index.js", "scripts": {