1
0
mirror of synced 2025-12-10 07:08:03 +08:00

Initial commit

This commit is contained in:
6tail
2018-06-23 17:22:52 +08:00
commit 34cf0e494a
6 changed files with 959 additions and 0 deletions

16
.gitignore vendored Normal file
View File

@@ -0,0 +1,16 @@
*.class
target/
#idea
.idea/
/idea/
*.ipr
*.iml
*.iws
# temp file
*.log
*.cache
*.diff
*.patch
*.tmp

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 6tail
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

38
README.md Normal file
View File

@@ -0,0 +1,38 @@
# lunar [![License](https://img.shields.io/badge/license-MIT-4EB1BA.svg?style=flat-square)](https://github.com/6tail/lunar-javascript/blob/master/LICENSE)
lunar is a calendar library for Solar and Chinese Lunar.
[简体中文](https://github.com/6tail/lunar-javascript/blob/master/README_ZH.md)
## Example
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="lunar.js"></script>
<script>
var solar = Solar.fromYmd(2016,9,8);
console.log(solar.toFullString());
console.log(solar.getLunar().toFullString());
</script>
</body>
</html>
```
Output:
2016-09-08 闰年 星期四 处女座
丙申年捌月初八 猴年 北方玄武 斗木獬
## Documentation
Please visit [http://6tail.cn/calendar/api.html](http://6tail.cn/calendar/api.html "http://6tail.cn/calendar/api.html")
## Contact
<a target="_blank" href="https://jq.qq.com/?_wv=1027&k=5F9Pbf0"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="lunar" title="lunar"></a>

38
README_ZH.md Normal file
View File

@@ -0,0 +1,38 @@
# lunar [![License](https://img.shields.io/badge/license-MIT-4EB1BA.svg?style=flat-square)](https://github.com/6tail/lunar-javascript/blob/master/LICENSE)
lunar是一个无依赖的支持阳历和阴历的日历工具库。
[English](https://github.com/6tail/lunar-javascript/blob/master/README.md)
## 示例
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="lunar.js"></script>
<script>
var solar = Solar.fromYmd(2016,9,8);
console.log(solar.toFullString());
console.log(solar.getLunar().toFullString());
</script>
</body>
</html>
```
输出结果:
2016-09-08 闰年 星期四 处女座
丙申年捌月初八 猴年 北方玄武 斗木獬
## 文档
请移步至 [http://6tail.cn/calendar/api.html](http://6tail.cn/calendar/api.html "http://6tail.cn/calendar/api.html")
## 联系
<a target="_blank" href="https://jq.qq.com/?_wv=1027&k=5F9Pbf0"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="lunar" title="lunar"></a>

26
demo.html Normal file
View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>lunar</title>
</head>
<body>
<script src="lunar.js"></script>
<script>
//当前日期生成农历对象
var date = Lunar.fromDate(new Date());
document.write(date.toFullString());
document.write('<br>');
//转阳历
document.write(date.getSolar().toFullString());
document.write('<br><br>');
//指定日期生成农历对象
date = Lunar.fromYmd(1986,4,21);
document.write(date.toFullString());
document.write('<br>');
//转阳历
document.write(date.getSolar().toFullString());
</script>
</body>
</html>

820
lunar.js Normal file
View File

@@ -0,0 +1,820 @@
(function(W){
var Solar = (function(){
var _fromDate = function(date){
return _fromYmd(date.getFullYear(),date.getMonth()+1,date.getDate());
};
var _fromYmd = function(y,m,d){
var solar = {
_p:{
year:y,
month:m,
day:d,
calendar:new Date(y+'/'+m+'/'+d)
},
getYear:function(){
return this._p.year;
},
getMonth:function(){
return this._p.month;
},
getDay:function(){
return this._p.day;
},
getWeek:function(){
return this._p.calendar.getDay();
},
getWeekInChinese:function(){
return SolarUtil.WEEK[this.getWeek()];
},
/**
* 获取当天的阳历周
* @param start 星期几作为一周的开始1234560分别代表星期一至星期天
*/
getSolarWeek:function(start){
return SolarWeek.fromDate(this._p.calendar,start);
},
isLeapYear:function(){
return SolarUtil.isLeapYear(this._p.year);
},
getFestivals:function(){
var l = [];
var f = SolarUtil.FESTIVAL[this._p.month+'-'+this._p.day];
if(f) l.push(f);
var week = this.getWeek();
var weekInMonth = Math.ceil((this._p.day-week)/7);
if(week>0) weekInMonth++;
f = SolarUtil.WEEK_FESTIVAL[this._p.month+'-'+weekInMonth+'-'+week];
if(f) l.push(f);
return l;
},
getXingzuo:function(){
var index = 11,m = this._p.month,d = this._p.day;
var y = m*100+d;
if(y>=321&&y<=419) index = 0;
else if(y>=420&&y<=520) index = 1;
else if(y>=521&&y<=620) index = 2;
else if(y>=621&&y<=722) index = 3;
else if(y>=723&&y<=822) index = 4;
else if(y>=823&&y<=922) index = 5;
else if(y>=923&&y<=1022) index = 6;
else if(y>=1023&&y<=1121) index = 7;
else if(y>=1122&&y<=1221) index = 8;
else if(y>=1222||y<=119) index = 9;
else if(y<=218) index = 10;
return SolarUtil.XINGZUO[index];
},
toString:function(){
return [this._p.year,(this._p.month<10?'0':'')+this._p.month,(this._p.day<10?'0':'')+this._p.day].join('-');
},
toFullString:function(){
var s = this.toString();
if(this.isLeapYear()){
s += ' 闰年';
}
s += ' 星期'+this.getWeekInChinese();
var festivals = this.getFestivals();
for(var i=0,j=festivals.length;i<j;i++){
s += ' ('+festivals[i]+')';
}
s += ' '+this.getXingzuo()+'座';
return s;
},
next:function(days){
var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day);
date.setDate(date.getDate()+days);
return _fromDate(date);
},
getLunar:function(){
return Lunar.fromDate(this._p.calendar);
}
};
return solar;
};
return {
fromYmd:function(y,m,d){return _fromYmd(y,m,d);},
fromDate:function(date){return _fromDate(date);}
};
})();
var Lunar = (function(){
var _fromDate = function(date){
var solar = Solar.fromDate(date);
var y = solar.getYear();
var m = solar.getMonth();
var d = solar.getDay();
var startY,startM,startD;
var lunarY,lunarM,lunarD;
if(y<2000){
startY = SolarUtil.BASE_YEAR;
startM = SolarUtil.BASE_MONTH;
startD = SolarUtil.BASE_DAY;
lunarY = LunarUtil.BASE_YEAR;
lunarM = LunarUtil.BASE_MONTH;
lunarD = LunarUtil.BASE_DAY;
}else{
startY = SolarUtil.BASE_YEAR+99;
startM = 1;
startD = 1;
lunarY = LunarUtil.BASE_YEAR+99;
lunarM = 11;
lunarD = 25;
}
var diff = 0;
for(var i=startY;i<y;i++){
diff += 365;
if(SolarUtil.isLeapYear(i)) diff += 1;
}
for(var i=startM;i<m;i++){
diff += SolarUtil.getDaysOfMonth(y,i);
}
diff += d-startD;
lunarD += diff;
var lastDate = LunarUtil.getDaysOfMonth(lunarY,lunarM);
while(lunarD>lastDate){
lunarD -= lastDate;
lunarM = LunarUtil.nextMonth(lunarY,lunarM);
if(lunarM==1) lunarY++;
lastDate = LunarUtil.getDaysOfMonth(lunarY,lunarM);
}
return _fromYmd(lunarY,lunarM,lunarD,solar);
};
var _fromYmd = function(y,m,d,solar){
var lunar = {
_p:{
year:y,
month:m,
day:d,
solar:null
},
_toSolar:function(){
var y = LunarUtil.BASE_YEAR;
var m = LunarUtil.BASE_MONTH;
var d = LunarUtil.BASE_DAY;
var diff = LunarUtil.getDaysOfMonth(y,m)-d;
m = LunarUtil.nextMonth(y,m);
while(true){
diff += LunarUtil.getDaysOfMonth(y,m);
m = LunarUtil.nextMonth(y,m);
if(m==1) y++;
if(y==this._p.year&&m==this._p.month){
diff += this._p.day;
break;
}
}
var date = new Date(SolarUtil.BASE_YEAR+'/'+SolarUtil.BASE_MONTH+'/'+SolarUtil.BASE_DAY);
date.setDate(date.getDate()+diff);
return Solar.fromDate(date);
},
getYear:function(){
return this._p.year;
},
getMonth:function(){
return this._p.month;
},
getDay:function(){
return this._p.day;
},
getGan:function(){
return LunarUtil.GAN[(this._p.year-4)%10+1];
},
getZhi:function(){
return LunarUtil.ZHI[(this._p.year-4)%12+1];
},
getShengxiao:function(){
return LunarUtil.SHENGXIAO[(this._p.year-4)%12+1];
},
getMonthInChinese:function(){
var month = this._p.month;
if(month>0){
return LunarUtil.MONTH[month];
}else{
return '闰'+LunarUtil.MONTH[-month];
}
},
getDayInChinese:function(){
return LunarUtil.DAY[this._p.day];
},
getJie:function(){
var s = '',solar = this._p.solar;
var solarYear = solar.getYear();
var solarMonth = solar.getMonth();
var solarDay = solar.getDay();
var index = 0;
var ry = solarYear-SolarUtil.BASE_YEAR+1;
while(ry>=LunarUtil.JIE_YEAR[solarMonth-1][index]){
index++;
}
var term = LunarUtil.JIE_MAP[solarMonth-1][4*index+ry%4];
if(ry==121&&solarMonth==4) term = 5;
if(ry==132&&solarMonth==4) term = 5;
if(ry==194&&solarMonth==6) term = 6;
if(solarDay==term) s = LunarUtil.JIE[solarMonth-1];
return s;
},
getQi:function(){
var s = '',solar = this._p.solar;
var solarYear = solar.getYear();
var solarMonth = solar.getMonth();
var solarDay = solar.getDay();
var index = 0;
var ry = solarYear-SolarUtil.BASE_YEAR+1;
while(ry>=LunarUtil.QI_YEAR[solarMonth-1][index]){
index++;
}
var term = LunarUtil.QI_MAP[solarMonth-1][4*index+ry%4];
if(ry==171&&solarMonth==3) term = 21;
if(ry==181&&solarMonth==5) term = 21;
if(solarDay==term) s = LunarUtil.QI[solarMonth-1];
return s;
},
getXiu:function(){
return LunarUtil.XIU[this._p.day-1][this._p.month-1];
},
getZheng:function(){
return LunarUtil.ZHENG[this.getXiu()];
},
getAnimal:function(){
return LunarUtil.ANIMAL[this.getXiu()];
},
getGong:function(){
return LunarUtil.GONG[this.getXiu()];
},
getShou:function(){
return LunarUtil.SHOU[this.getGong()];
},
getFestivals:function(){
var l = [];
var f = LunarUtil.FESTIVAL[this._p.month+'-'+this._p.day];
if(f) l.push(f);
return l;
},
getSolar:function(){
return this._p.solar;
},
toString:function(){
return this.getGan()+this.getZhi()+'年'+this.getMonthInChinese()+'月'+this.getDayInChinese();
},
toFullString:function(){
var s = this.toString();
s += ' '+this.getShengxiao()+'年';
var festivals = this.getFestivals();
for(var i=0,j=festivals.length;i<j;i++){
s += ' ('+festivals[i]+')';
}
var jieqi = this.getJie()+this.getQi();
if(jieqi.length>0){
s += ' ['+jieqi+']';
}
s += ' '+this.getGong()+'方'+this.getShou();
s += ' '+this.getXiu()+this.getZheng()+this.getAnimal();
return s;
}
};
lunar._p.solar = solar?solar:lunar._toSolar();
return lunar;
};
return {
fromYmd:function(y,m,d){return _fromYmd(y,m,d);},
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 _fromYmd = function(y,m,d,start){
var solarWeek = {
_p:{
year:y,
month:m,
day:d,
start:start,
calendar:new Date(y+'/'+m+'/'+d)
},
getYear:function(){
return this._p.year;
},
getMonth:function(){
return this._p.month;
},
getDay:function(){
return this._p.day;
},
getStart:function(){
return this._p.start;
},
/**
* 获取当前日期是在当月第几周
* @return 周序号从1开始
*/
getIndex:function(){
var firstDate = new Date(this._p.year+'/'+this._p.month+'/1');
var firstDayWeek = firstDate.getDay();
return Math.ceil((this._p.day+firstDayWeek-this._p.start)/7);
},
/**
* 周推移
* @param weeks 推移的周数,负数为倒推
* @param separateMonth 是否按月单独计算
* @return 推移后的阳历周
*/
next:function(weeks,separateMonth){
if(0==weeks){
return _fromYmd(this._p.year,this._p.month,this._p.day,this._p.start);
}
if(separateMonth){
var n = weeks;
var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day);
var week = _fromDate(date,this._p.start);
var month = this._p.month;
var plus = n>0;
while(0!=n){
date.setDate(date.getDate()+(plus?7:-7));
week = _fromDate(date,this._p.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(),this._p.start);
weekMonth = week.getMonth();
}else{
date = new Date(week.getYear()+'/'+week.getMonth()+'/1');
week = _fromDate(date,this._p.start);
}
}else{
var size = SolarUtil.getWeeksOfMonth(week.getYear(),week.getMonth(),this._p.start);
if(size==index){
var firstDay = week.getFirstDay();
var lastDay = firstDay.next(6);
week = _fromYmd(lastDay.getYear(),lastDay.getMonth(),lastDay.getDay(),this._p.start);
weekMonth = week.getMonth();
}else{
date = new Date(week.getYear()+'/'+week.getMonth()+'/'+SolarUtil.getDaysOfMonth(week.getYear(),week.getMonth()));
week = _fromDate(date,this._p.start);
}
}
month = weekMonth;
}
n-=plus?1:-1;
}
return week;
}else{
var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day);
date.setDate(date.getDate()+weeks*7);
return _fromDate(date,this._p.start);
}
},
/**
* 获取本周第一天的阳历日期(可能跨月)
* @return 本周第一天的阳历日期
*/
getFirstDay:function(){
var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day);
var week = date.getDay();
var prev = week-this._p.start;
if(prev<0){
prev += 7;
}
date.setDate(date.getDate()-prev);
return Solar.fromDate(date);
},
/**
* 获取本周第一天的阳历日期(仅限当月)
* @return 本周第一天的阳历日期
*/
getFirstDayInMonth:function(){
var days = this.getDays();
for(var i = 0;i<days.length;i++){
var day = days[i];
if(this._p.month==day.getMonth()){
return day;
}
}
return null;
},
/**
* 获取本周的阳历日期列表(可能跨月)
* @return 本周的阳历日期列表
*/
getDays:function(){
var firstDay = this.getFirstDay();
var l = [];
l.push(firstDay);
for(var i = 1;i<7;i++){
l.push(firstDay.next(i));
}
return l;
},
/**
* 获取本周的阳历日期列表(仅限当月)
* @return 本周的阳历日期列表(仅限当月)
*/
getDaysInMonth:function(){
var days = this.getDays();
var l = [];
for(var i = 0;i<days.length;i++){
var day = days[i];
if(this._p.month!=day.getMonth()){
continue;
}
l.push(day);
}
return l;
},
toString:function(){
return this.getYear()+'-'+this.getMonth()+'.'+this.getIndex();
},
toFullString:function(){
return this.getYear()+'年'+this.getMonth()+'月第'+this.getIndex()+'周';
}
};
return solarWeek;
};
return {
/**
* 指定年月日生成当天所在的阳历周
* @param y 年份
* @param m 月份
* @param d 日期
* @param start 星期几作为一周的开始1234560分别代表星期一至星期天
* @return 阳历周
*/
fromYmd:function(y,m,d,start){return _fromYmd(y,m,d,start);},
/**
* 指定日期生成当天所在的阳历周
* @param date 日期
* @param start 星期几作为一周的开始1234560分别代表星期一至星期天
* @return 阳历周
*/
fromDate:function(date,start){return _fromDate(date,start);}
};
})();
var SolarMonth = (function(){
var _fromDate = function(date){
return _fromYm(date.getFullYear(),date.getMonth()+1);
};
var _fromYm = function(y,m){
var solarMonth = {
_p:{
year:y,
month:m,
calendar:new Date(y+'/'+m+'/1')
},
getYear:function(){
return this._p.year;
},
getMonth:function(){
return this._p.month;
},
next:function(months){
var date = new Date(this._p.year+'/'+this._p.month+'/1');
date.setMonth(date.getMonth()+months);
return _fromDate(date);
},
getDays:function(){
var l = [];
var d = Solar.fromYmd(this._p.year,this._p.month,1);
l.push(d);
var days = SolarUtil.getDaysOfMonth(this._p.year,this._p.month);
for(var i = 1;i<days;i++){
l.push(d.next(i));
}
return l;
},
getWeeks:function(start){
var l = [];
var weeks = SolarUtil.getWeeksOfMonth(this._p.year,this._p.month,start);
for(var i = 0;i<weeks;i++){
l.push(SolarWeek.fromYmd(this._p.year,this._p.month,1+i*7,start));
}
return l;
},
toString:function(){
return this.getYear()+'-'+this.getMonth();
},
toFullString:function(){
return this.getYear()+'年'+this.getMonth()+'月';
}
};
return solarMonth;
};
return {
fromYm:function(y,m){return _fromYm(y,m);},
fromDate:function(date){return _fromDate(date);}
};
})();
var SolarSeason = (function(){
var _fromDate = function(date){
return _fromYm(date.getFullYear(),date.getMonth()+1);
};
var _fromYm = function(y,m){
var solarSeason = {
_p:{
year:y,
month:m,
calendar:new Date(y+'/'+m+'/1')
},
getYear:function(){
return this._p.year;
},
getMonth:function(){
return this._p.month;
},
/**
* 获取当月是第几季度
* @return 季度序号从1开始
*/
getIndex:function(){
return Math.ceil(this._p.month/3);
},
/**
* 季度推移
* @param seasons 推移的季度数,负数为倒推
* @return 推移后的季度
*/
next:function(seasons){
if(0==seasons){
return _fromYm(this._p.year,this._p.month);
}
var date = new Date(this._p.year+'/'+this._p.month+'/1');
date.setMonth(date.getMonth()+3*seasons);
return _fromDate(date);
},
/**
* 获取本季度的月份
* @return 本季度的月份列表
*/
getMonths:function(){
var l = [];
var index = this.getIndex()-1;
for(var i=0;i<3;i++){
l.push(SolarMonth.fromYm(this._p.year,3*index+i+1));
}
return l;
},
toString:function(){
return this.getYear()+'.'+this.getIndex();
},
toFullString:function(){
return this.getYear()+'年'+this.getIndex()+'季度';
}
};
return solarSeason;
};
return {
fromYm:function(y,m){return _fromYm(y,m);},
fromDate:function(date){return _fromDate(date);}
};
})();
var SolarHalfYear = (function(){
var _fromDate = function(date){
return _fromYm(date.getFullYear(),date.getMonth()+1);
};
var _fromYm = function(y,m){
var solarHalfYear = {
_p:{
year:y,
month:m,
calendar:new Date(y+'/'+m+'/1')
},
getYear:function(){
return this._p.year;
},
getMonth:function(){
return this._p.month;
},
/**
* 获取当月是第几半年
* @return 半年序号从1开始
*/
getIndex:function(){
return Math.ceil(this._p.month/6);
},
/**
* 半年推移
* @param halfYears 推移的半年数,负数为倒推
* @return 推移后的半年
*/
next:function(halfYears){
if(0==halfYears){
return _fromYm(this._p.year,this._p.month);
}
var date = new Date(this._p.year+'/'+this._p.month+'/1');
date.setMonth(date.getMonth()+6*halfYears);
return _fromDate(date);
},
/**
* 获取本半年的月份
* @return 本半年的月份列表
*/
getMonths:function(){
var l = [];
var index = this.getIndex()-1;
for(var i=0;i<6;i++){
l.push(SolarMonth.fromYm(this._p.year,6*index+i+1));
}
return l;
},
toString:function(){
return this.getYear()+'.'+this.getIndex();
},
toFullString:function(){
return this.getYear()+'年'+['上','下'][this.getIndex()-1]+'半年';
}
};
return solarHalfYear;
};
return {
fromYm:function(y,m){return _fromYm(y,m);},
fromDate:function(date){return _fromDate(date);}
};
})();
var SolarYear = (function(){
var _fromDate = function(date){
return _fromYear(date.getFullYear());
};
var _fromYear = function(y){
var solarYear = {
_p:{
year:y,
calendar:new Date(y+'/1/1')
},
getYear:function(){
return this._p.year;
},
next:function(years){
var date = new Date(this._p.year+'/1/1');
date.setFullYear(date.getFullYear()+years);
return _fromDate(date);
},
getMonths:function(){
var l = [];
var m = SolarMonth.fromYm(this._p.year,1);
l.push(m);
for(var i = 1;i<12;i++){
l.push(m.next(i));
}
return l;
},
toString:function(){
return this.getYear();
},
toFullString:function(){
return this.getYear()+'年';
}
};
return solarYear;
};
return {
fromYear:function(y){return _fromYear(y);},
fromDate:function(date){return _fromDate(date);}
};
})();
var SolarUtil = (function(){
var _isLeapYear = function(year){
var leap = false;
if(year%4==0) leap = true;
if(year%100==0) leap = false;
if(year%400==0) leap = true;
return leap;
};
return {
BASE_YEAR:1901,
BASE_MONTH:1,
BASE_DAY:1,
WEEK:['日','一','二','三','四','五','六'],
DAYS_OF_MONTH:[31,28,31,30,31,30,31,31,30,31,30,31],
XINGZUO:['白羊','金牛','双子','巨蟹','狮子','处女','天秤','天蝎','射手','摩羯','水瓶','双鱼'],
FESTIVAL:{'1-1':'元旦节','2-14':'情人节','3-8':'妇女节','3-12':'植树节','3-15':'消费者权益日','4-1':'愚人节','5-1':'劳动节','5-4':'青年节','6-1':'儿童节','7-1':'建党节','8-1':'建军节','9-10':'教师节','10-1':'国庆节','12-24':'平安夜','12-25':'圣诞节'},
WEEK_FESTIVAL:{'5-2-0':'母亲节','6-3-0':'父亲节','11-4-4':'感恩节'},
isLeapYear:function(y){return _isLeapYear(y);},
getDaysOfMonth:function(year,month){
var m = month-1;
var d = this.DAYS_OF_MONTH[m];
if(m==1&&this.isLeapYear(year)){
d++;
}
return d;
},
getWeeksOfMonth:function(year,month,start){
var days = this.getDaysOfMonth(year,month);
var firstDate = new Date(year+'/'+month+'/1');
var firstDayWeek = firstDate.getDay();
return Math.ceil((days+firstDayWeek-start)/7);
}
};
})();
var LunarUtil = (function(){
return {
BASE_YEAR:1900,
BASE_MONTH:11,
BASE_DAY:11,
BASE_INDEX:0,
GAN:['','甲','乙','丙','丁','戊','己','庚','辛','壬','癸'],
ZHI:['','子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥'],
SHENGXIAO:['','鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'],
MONTH:['','正','贰','叁','肆','伍','陆','柒','捌','玖','拾','冬','腊'],
DAY:['','初一','初二','初三','初四','初五','初六','初七','初八','初九','初十','十一','十二','十三','十四','十五','十六','十七','十八','十九','二十','廿一','廿二','廿三','廿四','廿五','廿六','廿七','廿八','廿九','三十'],
JIE:['小寒','立春','惊蛰','清明','立夏','芒种','小暑','立秋','白露','寒露','立冬','大雪'],
LEAP_MONTH_YEAR:[6,14,19,25,33,36,38,41,44,52,55,79,117,136,147,150,155,158,185,193],
LUNAR_MONTH:[0x00,0x04,0xad,0x08,0x5a,0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45,0x95,0x0a,0xa6,0x04,0x55,0x24,0xad,0x08,0x5a,0x62,0xda,0x04,0xb4,0x05,0xb4,0x55,0x52,0x0d,0x94,0x0a,0x4a,0x2a,0x56,0x02,0x6d,0x71,0x6d,0x01,0xda,0x02,0xd2,0x52,0xa9,0x05,0x49,0x0d,0x2a,0x45,0x2b,0x09,0x56,0x01,0xb5,0x20,0x6d,0x01,0x59,0x69,0xd4,0x0a,0xa8,0x05,0xa9,0x56,0xa5,0x04,0x2b,0x09,0x9e,0x38,0xb6,0x08,0xec,0x74,0x6c,0x05,0xd4,0x0a,0xe4,0x6a,0x52,0x05,0x95,0x0a,0x5a,0x42,0x5b,0x04,0xb6,0x04,0xb4,0x22,0x6a,0x05,0x52,0x75,0xc9,0x0a,0x52,0x05,0x35,0x55,0x4d,0x0a,0x5a,0x02,0x5d,0x31,0xb5,0x02,0x6a,0x8a,0x68,0x05,0xa9,0x0a,0x8a,0x6a,0x2a,0x05,0x2d,0x09,0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25,0x75,0x95,0x0a,0x96,0x04,0x4d,0x54,0xad,0x04,0xda,0x04,0xd4,0x44,0xb4,0x05,0x54,0x85,0x52,0x0d,0x92,0x0a,0x56,0x6a,0x56,0x02,0x6d,0x02,0x6a,0x41,0xda,0x02,0xb2,0xa1,0xa9,0x05,0x49,0x0d,0x0a,0x6d,0x2a,0x09,0x56,0x01,0xad,0x50,0x6d,0x01,0xd9,0x02,0xd1,0x3a,0xa8,0x05,0x29,0x85,0xa5,0x0c,0x2a,0x09,0x96,0x54,0xb6,0x08,0x6c,0x09,0x64,0x45,0xd4,0x0a,0xa4,0x05,0x51,0x25,0x95,0x0a,0x2a,0x72,0x5b,0x04,0xb6,0x04,0xac,0x52,0x6a,0x05,0xd2,0x0a,0xa2,0x4a,0x4a,0x05,0x55,0x94,0x2d,0x0a,0x5a,0x02,0x75,0x61,0xb5,0x02,0x6a,0x03,0x61,0x45,0xa9,0x0a,0x4a,0x05,0x25,0x25,0x2d,0x09,0x9a,0x68,0xda,0x08,0xb4,0x09,0xa8,0x59,0x54,0x03,0xa5,0x0a,0x91,0x3a,0x96,0x04,0xad,0xb0,0xad,0x04,0xda,0x04,0xf4,0x62,0xb4,0x05,0x54,0x0b,0x44,0x5d,0x52,0x0a,0x95,0x04,0x55,0x22,0x6d,0x02,0x5a,0x71,0xda,0x02,0xaa,0x05,0xb2,0x55,0x49,0x0b,0x4a,0x0a,0x2d,0x39,0x36,0x01,0x6d,0x80,0x6d,0x01,0xd9,0x02,0xe9,0x6a,0xa8,0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08,0xb4,0x38,0x6c,0x09,0x54,0x75,0xd4,0x0a,0xa4,0x05,0x45,0x55,0x95,0x0a,0x9a,0x04,0x55,0x44,0xb5,0x04,0x6a,0x82,0x6a,0x05,0xd2,0x0a,0x92,0x6a,0x4a,0x05,0x55,0x0a,0x2a,0x4a,0x5a,0x02,0xb5,0x02,0xb2,0x31,0x69,0x03,0x31,0x73,0xa9,0x0a,0x4a,0x05,0x2d,0x55,0x2d,0x09,0x5a,0x01,0xd5,0x48,0xb4,0x09,0x68,0x89,0x54,0x0b,0xa4,0x0a,0xa5,0x6a,0x95,0x04,0xad,0x08,0x6a,0x44,0xda,0x04,0x74,0x05,0xb0,0x25,0x54,0x03],
JIE_YEAR:[[13,49,85,117,149,185,201,250,250],[13,45,81,117,149,185,201,250,250],[13,48,84,112,148,184,200,201,250],[13,45,76,108,140,172,200,201,250],[13,44,72,104,132,168,200,201,250],[5,33,68,96,124,152,188,200,201],[29,57,85,120,148,176,200,201,250],[13,48,76,104,132,168,196,200,201],[25,60,88,120,148,184,200,201,250],[16,44,76,108,144,172,200,201,250],[28,60,92,124,160,192,200,201,250],[17,53,85,124,156,188,200,201,250]],
JIE_MAP:[[7,6,6,6,6,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,5,5,5,5,5,4,5,5],[5,4,5,5,5,4,4,5,5,4,4,4,4,4,4,4,4,3,4,4,4,3,3,4,4,3,3,3],[6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5],[5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,4,4,5,5,4,4,4,5,4,4,4,4,5],[6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5],[6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,5],[7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7],[8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7],[8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,7],[9,9,9,9,8,9,9,9,8,8,9,9,8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,8],[8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,7],[7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6,7,7]],
QI:['大寒','雨水','春分','谷雨','夏满','夏至','大暑','处暑','秋分','霜降','小雪','冬至'],
QI_YEAR:[[13,45,81,113,149,185,201],[21,57,93,125,161,193,201],[21,56,88,120,152,188,200,201],[21,49,81,116,144,176,200,201],[17,49,77,112,140,168,200,201],[28,60,88,116,148,180,200,201],[25,53,84,112,144,172,200,201],[29,57,89,120,148,180,200,201],[17,45,73,108,140,168,200,201],[28,60,92,124,160,192,200,201],[16,44,80,112,148,180,200,201],[17,53,88,120,156,188,200,201]],
QI_MAP:[[21,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,20,20,20,20,20,19,20,20,20,19,19,20],[20,19,19,20,20,19,19,19,19,19,19,19,19,18,19,19,19,18,18,19,19,18,18,18,18,18,18,18],[21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,20],[20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20,19,20,20,20,19,19,20,20,19,19,19,20,20],[21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,21],[22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,21],[23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,23],[23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23],[23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,23],[24,24,24,24,23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,23],[23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,22],[22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,22]],
XIU:[
['室','奎','胃','毕','参','鬼','张','角','氐','心','斗','虚'],
['壁','娄','昴','觜','井','柳','翼','亢','房','尾','女','危'],
['奎','胃','毕','参','鬼','星','轸','氐','心','箕','虚','室'],
['娄','昴','觜','井','柳','张','角','房','尾','斗','危','壁'],
['胃','毕','参','鬼','星','翼','亢','心','箕','女','室','奎'],
['昴','觜','井','柳','张','轸','氐','尾','斗','虚','壁','娄'],
['毕','参','鬼','星','翼','角','房','箕','女','危','奎','胃'],
['觜','井','柳','张','轸','亢','心','斗','虚','室','娄','昴'],
['参','鬼','星','翼','角','氐','尾','女','危','壁','胃','毕'],
['井','柳','张','轸','亢','房','箕','虚','室','奎','昴','觜'],
['鬼','星','翼','角','氐','心','斗','危','壁','娄','毕','参'],
['柳','张','轸','亢','房','尾','女','室','奎','胃','觜','井'],
['星','翼','角','氐','心','箕','虚','壁','娄','昴','参','鬼'],
['张','轸','亢','房','尾','斗','危','奎','胃','毕','井','柳'],
['翼','角','氐','心','箕','女','室','娄','昴','觜','鬼','星'],
['轸','亢','房','尾','斗','虚','壁','胃','毕','参','柳','张'],
['角','氐','心','箕','女','危','奎','昴','觜','井','星','翼'],
['亢','房','尾','斗','虚','室','娄','毕','参','鬼','张','轸'],
['氐','心','箕','女','危','壁','胃','觜','井','柳','翼','角'],
['房','尾','斗','虚','室','奎','昴','参','鬼','星','轸','亢'],
['心','箕','女','危','壁','娄','毕','井','柳','张','角','氐'],
['尾','斗','虚','室','奎','胃','觜','鬼','星','翼','亢','房'],
['箕','女','危','壁','娄','昴','参','柳','张','轸','氐','心'],
['斗','虚','室','奎','胃','毕','井','星','翼','角','房','尾'],
['女','危','壁','娄','昴','觜','鬼','张','轸','亢','心','箕'],
['虚','室','奎','胃','毕','参','柳','翼','角','氐','尾','斗'],
['危','壁','娄','昴','觜','井','星','轸','亢','房','箕','女'],
['室','奎','胃','毕','参','鬼','张','角','氐','心','斗','虚'],
['壁','娄','昴','觜','井','柳','翼','亢','房','尾','女','危'],
['胃','鬼','氐','心','虚','星','轸','氐','心','箕','虚','室']
],
ZHENG:{'角':'木','井':'木','奎':'木','斗':'木','亢':'金','鬼':'金','娄':'金','牛':'金','氐':'土','柳':'土','胃':'土','女':'土','房':'日','星':'日','昴':'日','虚':'日','心':'月','张':'月','毕':'月','危':'月','尾':'火','翼':'火','觜':'火','室':'火','箕':'水','轸':'水','参':'水','壁':'水' },
ANIMAL:{'角':'蛟','斗':'獬','奎':'狼','井':'犴','亢':'龙','牛':'牛','娄':'狗','鬼':'羊','女':'蝠','氐':'貉','胃':'彘','柳':'獐','房':'兔','虚':'鼠','昴':'鸡','星':'马','心':'狐','危':'燕','毕':'乌','张':'鹿','尾':'虎','室':'猪','觜':'猴','翼':'蛇','箕':'豹','壁':'獝','参':'猿','轸':'蚓' },
GONG:{'角':'东','井':'南','奎':'西','斗':'北','亢':'东','鬼':'南','娄':'西','牛':'北','氐':'南','柳':'南','胃':'西','女':'北','房':'东','星':'南','昴':'西','虚':'北','心':'东','张':'南','毕':'西','危':'北','尾':'东','翼':'南','觜':'西','室':'北','箕':'东','轸':'南','参':'西','壁':'北' },
SHOU:{'东':'青龙','南':'朱雀','西':'白虎','北':'玄武'},
FESTIVAL:{'1-1':'春节','1-15':'元宵节','2-2':'龙头节','5-5':'端午节','7-7':'七夕节','8-15':'中秋节','9-9':'重阳节','12-8':'腊八节'},
nextMonth:function(y,m){
var n = Math.abs(m)+1;
if(m>0){
var index = y-this.BASE_YEAR+this.BASE_INDEX;
var v = this.LUNAR_MONTH[2*index+1];
v = (v>>4)&0x0F;
if(v==m){
n = -m;
}
}
if(n==13) n = 1;
return n;
},
getDaysOfMonth:function(year,month){
var index = year-this.BASE_YEAR+this.BASE_INDEX;
var v = 0,l = 0,d = 30;
if(1<=month&&month<=8){
v = this.LUNAR_MONTH[2*index];
l = month-1;
if(((v>>l)&0x01)==1){
d = 29;
}
}else if(9<=month&&month<=12){
v = this.LUNAR_MONTH[2*index+1];
l = month-9;
if(((v>>l)&0x01)==1){
d = 29;
}
}else{
v = this.LUNAR_MONTH[2*index+1];
v = (v>>4)&0x0F;
if(v!=Math.abs(month)){
d = 0;
}else{
d = 29;
for(var i = 0;i<this.LEAP_MONTH_YEAR.length;i++){
if(this.LEAP_MONTH_YEAR[i]==index){
d = 30;
break;
}
}
}
}
return d;
}
};
})();
W.SolarUtil = SolarUtil;
W.LunarUtil = LunarUtil;
W.Solar = Solar;
W.Lunar = Lunar;
W.SolarWeek = SolarWeek;
W.SolarMonth = SolarMonth;
W.SolarSeason = SolarSeason;
W.SolarHalfYear = SolarHalfYear;
W.SolarYear = SolarYear;
})(window);