1
0
mirror of synced 2025-12-16 01:58:02 +08:00

v1.2.2 修复1-99年日期错乱的问题。

This commit is contained in:
6tail
2021-04-13 22:53:45 +08:00
parent 0c000c99a7
commit aead9412ed
2 changed files with 65 additions and 46 deletions

109
lunar.js
View File

@@ -10,6 +10,24 @@
} }
} }
})(this,function(){ })(this,function(){
var ExactDate = (function(){
return {
_:function(date,y,m,d){
if(y<100){
date.setFullYear(y);
date.setMonth(m-1);
date.setDate(d);
}
return date;
},
fromYmd:function(y,m,d){
return this._(new Date(y+'/'+m+'/'+d+' 0:0:0'),y,m,d);
},
fromYmdHms:function(y,m,d,hour,minute,second){
return this._(new Date(y+'/'+m+'/'+d+' '+hour+':'+minute+':'+second),y,m,d);
}
};
})();
var Solar = (function(){ var Solar = (function(){
var _fromDate = function(date){ var _fromDate = function(date){
return _fromYmdHms(date.getFullYear(),date.getMonth()+1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds()); return _fromYmdHms(date.getFullYear(),date.getMonth()+1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds());
@@ -49,12 +67,6 @@
return _fromYmdHms(year,month,day,hour,minute,second); return _fromYmdHms(year,month,day,hour,minute,second);
}; };
var _fromYmdHms = function(y,m,d,hour,minute,second){ var _fromYmdHms = function(y,m,d,hour,minute,second){
var calendar = new Date(y+'/'+m+'/'+d+' '+hour+':'+minute+':'+second);
if(y<100) {
calendar.setFullYear(y);
calendar.setMonth(m - 1);
calendar.setDate(d);
}
return { return {
_p:{ _p:{
year:y, year:y,
@@ -63,7 +75,7 @@
hour:hour, hour:hour,
minute:minute, minute:minute,
second:second, second:second,
calendar:calendar calendar:ExactDate.fromYmdHms(y,m,d,hour,minute,second)
}, },
getYear:function(){ getYear:function(){
return this._p.year; return this._p.year;
@@ -177,7 +189,7 @@
return s; return s;
}, },
next:function(days, onlyWorkday){ next:function(days, onlyWorkday){
var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day+' '+this._p.hour+':'+this._p.minute+':'+this._p.second); var date = ExactDate.fromYmdHms(this._p.year,this._p.month,this._p.day,this._p.hour,this._p.minute,this._p.second);
if(0!=days){ if(0!=days){
if (!onlyWorkday){ if (!onlyWorkday){
date.setDate(date.getDate() + days); date.setDate(date.getDate() + days);
@@ -361,6 +373,18 @@
zExact++; zExact++;
} }
} }
if(yearGanIndex<0){
yearGanIndex += 10;
}
if(yearGanIndex>=10){
yearGanIndex-=10;
}
if(yearZhiIndex<0){
yearZhiIndex += 12;
}
if(yearZhiIndex>=12){
yearZhiIndex-=12;
}
if(g<0){ if(g<0){
g += 10; g += 10;
} }
@@ -485,15 +509,7 @@
return o; return o;
}; };
var _fromDate = function(date){ var _fromDate = function(date){
var solarYear = date.getFullYear(); var c = ExactDate.fromYmd(date.getFullYear(),date.getMonth()+1,date.getDate());
var solarMonth = date.getMonth();
var solarDay = date.getDate();
var c = new Date(solarYear + '/' + (solarMonth + 1) + '/' + solarDay + ' 0:0:0');
if(solarYear<100){
c.setFullYear(solarYear);
c.setMonth(solarMonth);
c.setDate(solarDay);
}
var solarTime = c.getTime(); var solarTime = c.getTime();
var lunarYear = 0; var lunarYear = 0;
var lunarMonth = 0; var lunarMonth = 0;
@@ -1358,14 +1374,14 @@
}; };
}, },
getShuJiu:function(){ getShuJiu:function(){
var currentCalendar = new Date(this._p.solar.getYear() + '/' + this._p.solar.getMonth() + '/' + this._p.solar.getDay() + ' 0:0:0'); var currentCalendar = ExactDate.fromYmd(this._p.solar.getYear(),this._p.solar.getMonth(),this._p.solar.getDay());
var start = this._p.jieQi[Lunar.JIE_QI_APPEND]; var start = this._p.jieQi[Lunar.JIE_QI_APPEND];
var startCalendar = new Date(start.getYear() + '/' + start.getMonth() + '/' + start.getDay() + ' 0:0:0'); var startCalendar = ExactDate.fromYmd(start.getYear(),start.getMonth(),start.getDay());
if (currentCalendar < startCalendar) { if (currentCalendar < startCalendar) {
start = this._p.jieQi[Lunar.JIE_QI_FIRST]; start = this._p.jieQi[Lunar.JIE_QI_FIRST];
startCalendar = new Date(start.getYear() + '/' + start.getMonth() + '/' + start.getDay() + ' 0:0:0'); startCalendar = ExactDate.fromYmd(start.getYear(),start.getMonth(),start.getDay());
} }
var endCalendar = new Date(start.getYear() + '/' + start.getMonth() + '/' + start.getDay() + ' 0:0:0'); var endCalendar = ExactDate.fromYmd(start.getYear(),start.getMonth(),start.getDay());
endCalendar.setDate(endCalendar.getDate() + 81); endCalendar.setDate(endCalendar.getDate() + 81);
if (currentCalendar < startCalendar || currentCalendar >= endCalendar) { if (currentCalendar < startCalendar || currentCalendar >= endCalendar) {
return null; return null;
@@ -1374,10 +1390,10 @@
return this._buildNameAndIndex(LunarUtil.NUMBER[Math.floor(days / 9) + 1] + '九', days % 9 + 1); return this._buildNameAndIndex(LunarUtil.NUMBER[Math.floor(days / 9) + 1] + '九', days % 9 + 1);
}, },
getFu:function(){ getFu:function(){
var currentCalendar = new Date(this._p.solar.getYear() + '/' + this._p.solar.getMonth() + '/' + this._p.solar.getDay() + ' 0:0:0'); var currentCalendar = ExactDate.fromYmd(this._p.solar.getYear(),this._p.solar.getMonth(),this._p.solar.getDay());
var xiaZhi = this._p.jieQi['夏至']; var xiaZhi = this._p.jieQi['夏至'];
var liQiu = this._p.jieQi['立秋']; var liQiu = this._p.jieQi['立秋'];
var startCalendar = new Date(xiaZhi.getYear() + '/' + xiaZhi.getMonth() + '/' + xiaZhi.getDay() + ' 0:0:0'); var startCalendar = ExactDate.fromYmd(xiaZhi.getYear(),xiaZhi.getMonth(),xiaZhi.getDay());
// 第1个庚日 // 第1个庚日
var add = 6 - xiaZhi.getLunar().getDayGanIndex(); var add = 6 - xiaZhi.getLunar().getDayGanIndex();
@@ -1409,7 +1425,7 @@
// 第5个庚日中伏第11天或末伏第1天 // 第5个庚日中伏第11天或末伏第1天
startCalendar.setDate(startCalendar.getDate() + 10); startCalendar.setDate(startCalendar.getDate() + 10);
var liQiuCalendar = new Date(liQiu.getYear() + '/' + liQiu.getMonth() + '/' + liQiu.getDay() + ' 0:0:0'); var liQiuCalendar = ExactDate.fromYmd(liQiu.getYear(),liQiu.getMonth(),liQiu.getDay());
days = Math.floor((currentCalendar.getTime() - startCalendar.getTime()) / MS_PER_DAY); days = Math.floor((currentCalendar.getTime() - startCalendar.getTime()) / MS_PER_DAY);
// 末伏 // 末伏
@@ -1444,9 +1460,9 @@
break; break;
} }
} }
var currentCalendar = new Date(this._p.solar.getYear() + '/' + this._p.solar.getMonth() + '/' + this._p.solar.getDay() + ' 0:0:0'); var currentCalendar = ExactDate.fromYmd(this._p.solar.getYear(),this._p.solar.getMonth(),this._p.solar.getDay());
var startSolar = jieQi.getSolar(); var startSolar = jieQi.getSolar();
var startCalendar = new Date(startSolar.getYear() + '/' + startSolar.getMonth() + '/' + startSolar.getDay() + ' 0:0:0'); var startCalendar = ExactDate.fromYmd(startSolar.getYear(),startSolar.getMonth(),startSolar.getDay());
var days = Math.floor((currentCalendar.getTime() - startCalendar.getTime()) / MS_PER_DAY); var days = Math.floor((currentCalendar.getTime() - startCalendar.getTime()) / MS_PER_DAY);
return LunarUtil.WU_HOU[offset*3+Math.floor(days/5)]; return LunarUtil.WU_HOU[offset*3+Math.floor(days/5)];
} }
@@ -1479,7 +1495,7 @@
month:m, month:m,
day:d, day:d,
start:start, start:start,
calendar:new Date(y+'/'+m+'/'+d) calendar:ExactDate.fromYmd(y,m,d)
}, },
getYear:function(){ getYear:function(){
return this._p.year; return this._p.year;
@@ -1498,7 +1514,7 @@
* @return number 周序号从1开始 * @return number 周序号从1开始
*/ */
getIndex:function(){ getIndex:function(){
var firstDate = new Date(this._p.year+'/'+this._p.month+'/1'); var firstDate = ExactDate.fromYmd(this._p.year,this._p.month,1);
var firstDayWeek = firstDate.getDay(); var firstDayWeek = firstDate.getDay();
if(firstDayWeek===0){ if(firstDayWeek===0){
firstDayWeek = 7; firstDayWeek = 7;
@@ -1518,7 +1534,7 @@
var date; var date;
if(separateMonth){ if(separateMonth){
var n = weeks; var n = weeks;
date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day); date = ExactDate.fromYmd(this._p.year,this._p.month,this._p.day);
var week = _fromDate(date,this._p.start); var week = _fromDate(date,this._p.start);
var month = this._p.month; var month = this._p.month;
var plus = n>0; var plus = n>0;
@@ -1534,7 +1550,7 @@
week = _fromYmd(firstDay.getYear(),firstDay.getMonth(),firstDay.getDay(),this._p.start); week = _fromYmd(firstDay.getYear(),firstDay.getMonth(),firstDay.getDay(),this._p.start);
weekMonth = week.getMonth(); weekMonth = week.getMonth();
}else{ }else{
date = new Date(week.getYear()+'/'+week.getMonth()+'/1'); date = ExactDate.fromYmd(week.getYear(),week.getMonth(),1);
week = _fromDate(date,this._p.start); week = _fromDate(date,this._p.start);
} }
}else{ }else{
@@ -1544,7 +1560,7 @@
week = _fromYmd(lastDay.getYear(),lastDay.getMonth(),lastDay.getDay(),this._p.start); week = _fromYmd(lastDay.getYear(),lastDay.getMonth(),lastDay.getDay(),this._p.start);
weekMonth = week.getMonth(); weekMonth = week.getMonth();
}else{ }else{
date = new Date(week.getYear()+'/'+week.getMonth()+'/'+SolarUtil.getDaysOfMonth(week.getYear(),week.getMonth())); date = ExactDate.fromYmd(week.getYear(),week.getMonth(),SolarUtil.getDaysOfMonth(week.getYear(),week.getMonth()));
week = _fromDate(date,this._p.start); week = _fromDate(date,this._p.start);
} }
} }
@@ -1554,7 +1570,7 @@
} }
return week; return week;
}else{ }else{
date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day); date = ExactDate.fromYmd(this._p.year,this._p.month,this._p.day);
date.setDate(date.getDate()+weeks*7); date.setDate(date.getDate()+weeks*7);
return _fromDate(date,this._p.start); return _fromDate(date,this._p.start);
} }
@@ -1564,7 +1580,7 @@
* @return object 本周第一天的阳历日期 * @return object 本周第一天的阳历日期
*/ */
getFirstDay:function(){ getFirstDay:function(){
var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day); var date = ExactDate.fromYmd(this._p.year,this._p.month,this._p.day);
var prev = date.getDay()-this._p.start; var prev = date.getDay()-this._p.start;
if(prev<0){ if(prev<0){
prev += 7; prev += 7;
@@ -1652,7 +1668,7 @@
_p:{ _p:{
year:y, year:y,
month:m, month:m,
calendar:new Date(y+'/'+m+'/1') calendar:ExactDate.fromYmd(y,m,1)
}, },
getYear:function(){ getYear:function(){
return this._p.year; return this._p.year;
@@ -1661,7 +1677,7 @@
return this._p.month; return this._p.month;
}, },
next:function(months){ next:function(months){
var date = new Date(this._p.year+'/'+this._p.month+'/1'); var date = ExactDate.fromYmd(this._p.year,this._p.month,1);
date.setMonth(date.getMonth()+months); date.setMonth(date.getMonth()+months);
return _fromDate(date); return _fromDate(date);
}, },
@@ -1705,7 +1721,7 @@
_p:{ _p:{
year:y, year:y,
month:m, month:m,
calendar:new Date(y+'/'+m+'/1') calendar:ExactDate.fromYmd(y,m,1)
}, },
getYear:function(){ getYear:function(){
return this._p.year; return this._p.year;
@@ -1729,7 +1745,7 @@
if(0===seasons){ if(0===seasons){
return _fromYm(this._p.year,this._p.month); return _fromYm(this._p.year,this._p.month);
} }
var date = new Date(this._p.year+'/'+this._p.month+'/1'); var date = ExactDate.fromYmd(this._p.year,this._p.month,1);
date.setMonth(date.getMonth()+3*seasons); date.setMonth(date.getMonth()+3*seasons);
return _fromDate(date); return _fromDate(date);
}, },
@@ -1767,7 +1783,7 @@
_p:{ _p:{
year:y, year:y,
month:m, month:m,
calendar:new Date(y+'/'+m+'/1') calendar:ExactDate.fromYmd(y,m,1)
}, },
getYear:function(){ getYear:function(){
return this._p.year; return this._p.year;
@@ -1791,7 +1807,7 @@
if(0===halfYears){ if(0===halfYears){
return _fromYm(this._p.year,this._p.month); return _fromYm(this._p.year,this._p.month);
} }
var date = new Date(this._p.year+'/'+this._p.month+'/1'); var date = ExactDate.fromYmd(this._p.year,this._p.month,1);
date.setMonth(date.getMonth()+6*halfYears); date.setMonth(date.getMonth()+6*halfYears);
return _fromDate(date); return _fromDate(date);
}, },
@@ -1828,13 +1844,13 @@
return { return {
_p:{ _p:{
year:y, year:y,
calendar:new Date(y+'/1/1') calendar:ExactDate.fromYmd(y,1,1)
}, },
getYear:function(){ getYear:function(){
return this._p.year; return this._p.year;
}, },
next:function(years){ next:function(years){
var date = new Date(this._p.year+'/1/1'); var date = ExactDate.fromYmd(this._p.year,1,1);
date.setFullYear(date.getFullYear()+years); date.setFullYear(date.getFullYear()+years);
return _fromDate(date); return _fromDate(date);
}, },
@@ -2239,7 +2255,7 @@
}, },
getWeeksOfMonth:function(year,month,start){ getWeeksOfMonth:function(year,month,start){
var days = this.getDaysOfMonth(year,month); var days = this.getDaysOfMonth(year,month);
var firstDate = new Date(year+'/'+month+'/1'); var firstDate = ExactDate.fromYmd(year,month,1);
var firstDayWeek = firstDate.getDay(); var firstDayWeek = firstDate.getDay();
return Math.ceil((days+firstDayWeek-start)/7); return Math.ceil((days+firstDayWeek-start)/7);
} }
@@ -2992,8 +3008,8 @@
const startTimeZhiIndex = (start.getHour() == 23) ? 11 : LunarUtil.getTimeZhiIndex(start.toYmdHms().substr(11, 5)); const startTimeZhiIndex = (start.getHour() == 23) ? 11 : LunarUtil.getTimeZhiIndex(start.toYmdHms().substr(11, 5));
// 时辰差 // 时辰差
var hourDiff = endTimeZhiIndex - startTimeZhiIndex; var hourDiff = endTimeZhiIndex - startTimeZhiIndex;
var endCalendar = new Date(end.getYear(), end.getMonth() - 1, end.getDay()); var endCalendar = ExactDate.fromYmd(end.getYear(), end.getMonth(), end.getDay());
var startCalendar = new Date(start.getYear(), start.getMonth() - 1, start.getDay()); var startCalendar = ExactDate.fromYmd(start.getYear(), start.getMonth(), start.getDay());
// 天数差 // 天数差
var dayDiff = Math.floor((endCalendar - startCalendar) / (1000 * 3600 * 24)); var dayDiff = Math.floor((endCalendar - startCalendar) / (1000 * 3600 * 24));
if (hourDiff < 0) { if (hourDiff < 0) {
@@ -3192,7 +3208,10 @@
getLunar: function(){return this._p.lunar;}, getLunar: function(){return this._p.lunar;},
getStartSolar: function(){ getStartSolar: function(){
var birth = this._p.lunar.getSolar(); var birth = this._p.lunar.getSolar();
var c = new Date(birth.getYear() + this._p.startYear, birth.getMonth() - 1+this._p.startMonth, birth.getDay() + this._p.startDay); var c = birth.getCalendar();
c.setFullYear(birth.getYear() + this._p.startYear);
c.setMonth(birth.getMonth()-1+this._p.startMonth);
c.setDate(birth.getDay() + this._p.startDay);
return Solar.fromDate(c); return Solar.fromDate(c);
}, },
getDaYun: function(){ getDaYun: function(){

View File

@@ -1,6 +1,6 @@
{ {
"name": "lunar-javascript", "name": "lunar-javascript",
"version": "1.2.1", "version": "1.2.2",
"description": "lunar is a calendar library for Solar and Chinese Lunar.", "description": "lunar is a calendar library for Solar and Chinese Lunar.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {