公历及农历和24节气转换

一、换算的js代码

js文件名为:date_new.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
// JavaScript Document
function RunGLNLJQ(){
/* 阳历部分 */
var today=new Date();
var d=new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
var DDDD=today.getFullYear()+"年"+[today.getMonth()+1]+"月"+today.getDate()+"日";
//intHours = today.getHours();
//intMinutes = today.getMinutes();
//intSeconds = today.getSeconds();
//if (intHours == 0) {
//hours = "12:";
//xfile = "午夜";
//} else if (intHours < 12) {
//hours = intHours+":";
//xfile = "上午";
//} else if (intHours == 12) {
//hours = "12:";
//xfile = "正午";
//} else {
//intHours = intHours - 12
//hours = intHours + ":";
//xfile = "下午";
//}
//if (intMinutes < 10) {
//minutes = "0"+intMinutes+":";
//} else {
//minutes = intMinutes+":";
//}
//if (intSeconds < 10) {
//seconds = "0"+intSeconds+" ";
//} else {
//seconds = intSeconds+" ";
//}
//DDDD=DDDD+xfile+hours+minutes+seconds;
DDDD=DDDD+" "+ d[today.getDay()];
var DDDD = DDDD+ " " + (CnDateofDateStr(today)); //显示农历
DDDD = DDDD+SolarTerm(today); //显示二十四节气

document.write(DDDD);
};

function DaysNumberofDate(DateGL){
return parseInt((Date.parse(DateGL)-Date.parse(DateGL.getFullYear()+"/1/1"))/86400000)+1;
}
function CnDateofDate(DateGL){
var CnData=new Array(
0x16,0x2a,0xda,0x00,0x83,0x49,0xb6,0x05,0x0e,0x64,0xbb,0x00,0x19,0xb2,0x5b,0x00, //1997~2000
0x87,0x6a,0x57,0x04,0x12,0x75,0x2b,0x00,0x1d,0xb6,0x95,0x00,0x8a,0xad,0x55,0x02, //2001~2004
0x15,0x55,0xaa,0x00,0x82,0x55,0x6c,0x07,0x0d,0xc9,0x76,0x00,0x17,0x64,0xb7,0x00, //2005~2008
0x86,0xe4,0xae,0x05,0x11,0xea,0x56,0x00,0x1b,0x6d,0x2a,0x00,0x88,0x5a,0xaa,0x04, //2009~2012
0x14,0xad,0x55,0x00,0x81,0xaa,0xd5,0x09,0x0b,0x52,0xea,0x00,0x16,0xa9,0x6d,0x00, //2013~2016
0x84,0xa9,0x5d,0x06,0x0f,0xd4,0xae,0x00,0x1a,0xea,0x4d,0x00,0x87,0xba,0x55,0x04, //2017~2020
0x12,0x5a,0xaa,0x00,0x16,0xa9,0x6d,0x00,0x8a,0xa6,0xd5,0x02,0x14,0x52,0xda,0x00, //2021~2024
0x82,0x52,0xba,0x06,0x8d,0xa9,0x3b,0x00,0x98,0xb4,0x9b,0x00,0x85,0x74,0x9b,0x05, //2025~2028
0x11,0xb5,0x4d,0x00, //2029年;另外2030年第一天冬月28,0x1c
);


var CnMonth=new Array();
var CnMonthDays=new Array();
var CnBeginDay;
var LeapMonth;
var Bytes=new Array();
var I;
var CnMonthData;
var DaysCount;
var CnDaysCount;
var ResultMonth;
var ResultDay;
var yyyy=DateGL.getFullYear();
var mm=DateGL.getMonth()+1;
var dd=DateGL.getDate();
if(yyyy<100) yyyy+=1900;
if ((yyyy < 1997) || (yyyy > 2029)){
return 0;
}
Bytes[0] = CnData[(yyyy - 1997) * 4];
Bytes[1] = CnData[(yyyy - 1997) * 4 + 1];
Bytes[2] = CnData[(yyyy - 1997) * 4 + 2];
Bytes[3] = CnData[(yyyy - 1997) * 4 + 3];
if ((Bytes[0] & 0x80) != 0) {CnMonth[0] = 12;}
else {CnMonth[0] = 11;}
CnBeginDay = (Bytes[0] & 0x7f);
CnMonthData = Bytes[1];
CnMonthData = CnMonthData << 8;
CnMonthData = CnMonthData | Bytes[2];
LeapMonth = Bytes[3];
for (I = 15; I >= 0 ; I--){
CnMonthDays[15 - I] = 29;
if (((1 << I) & CnMonthData) != 0 ){
CnMonthDays[15 - I]++;}
if (CnMonth[15 - I] == LeapMonth ){
CnMonth[15 - I + 1] = - LeapMonth;}
else{
if (CnMonth[15 - I] < 0 ){CnMonth[15 - I + 1] = - CnMonth[15 - I] + 1;}
else {CnMonth[15 - I + 1] = CnMonth[15 - I] + 1;}
if (CnMonth[15 - I + 1] > 12 ){ CnMonth[15 - I + 1] = 1;}
}
}
DaysCount = DaysNumberofDate(DateGL) - 1;
if (DaysCount <= (CnMonthDays[0] - CnBeginDay)){
if ((yyyy > 1901) && (CnDateofDate(new Date((yyyy - 1)+"/12/31")) < 0)){
ResultMonth = - CnMonth[0];}
else {ResultMonth = CnMonth[0];}
ResultDay = CnBeginDay + DaysCount;
}
else{
CnDaysCount = CnMonthDays[0] - CnBeginDay;
I = 1;
while ((CnDaysCount < DaysCount) && (CnDaysCount + CnMonthDays[I] < DaysCount)){
CnDaysCount+= CnMonthDays[I];
I++;
}
ResultMonth = CnMonth[I];
ResultDay = DaysCount - CnDaysCount;
}
if (ResultMonth > 0){
return ResultMonth * 100 + ResultDay;}
else{return ResultMonth * 100 - ResultDay;}
}
function CnYearofDate(DateGL){
var YYYY= DateGL.getFullYear();
var MM = DateGL.getMonth()+1;
var CnMM=parseInt(Math.abs(CnDateofDate(DateGL))/100);
if(YYYY < 100) YYYY += 1900;
if(CnMM > MM) YYYY--;
YYYY -= 1864;
return CnEra(YYYY) + "年";
}
function CnMonthofDate(DateGL){
var CnMonthStr=new Array("零","正","二","三","四","五","六","七","八","九","十","冬","腊");
var Month;
Month = parseInt(CnDateofDate(DateGL)/100);
if (Month < 0){return "闰" + CnMonthStr[-Month] + "月";}
else{return CnMonthStr[Month] + "月";}
}
function CnDayofDate(DateGL){
var CnDayStr=new Array("零",
"初一", "初二", "初三", "初四", "初五",
"初六", "初七", "初八", "初九", "初十",
"十一", "十二", "十三", "十四", "十五",
"十六", "十七", "十八", "十九", "二十",
"廿一", "廿二", "廿三", "廿四", "廿五",
"廿六", "廿七", "廿八", "廿九", "三十");
var Day;
Day = (Math.abs(CnDateofDate(DateGL)))%100;
return CnDayStr[Day];
}
function DaysNumberofMonth(DateGL){
var MM1=DateGL.getFullYear();
MM1<100 ? MM1+=1900:MM1;
var MM2=MM1;
MM1+="/"+(DateGL.getMonth()+1);
MM2+="/"+(DateGL.getMonth()+2);
MM1+="/1";
MM2+="/1";
return parseInt((Date.parse(MM2)-Date.parse(MM1))/86400000);
}
function CnEra(YYYY){
var Tiangan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
var Dizhi=new Array("子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)","巳(蛇)",
"午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)");
//var Dizhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
return Tiangan[YYYY%10]+Dizhi[YYYY%12];
}


function CnDateofDateStr(DateGL){
if(CnMonthofDate(DateGL)=="零月") return " 请调整您的计算机日期!";
else return " "+CnYearofDate(DateGL)+ " " + CnMonthofDate(DateGL) + CnDayofDate(DateGL);
}
function SolarTerm(DateGL){
var SolarTermStr=new Array(
"小寒","大寒","立春","雨水","惊蛰","春分",
"清明","谷雨","立夏","小满","芒种","夏至",
"小暑","大暑","立秋","处暑","白露","秋分",
"寒露","霜降","立冬","小雪","大雪","冬至");
var DifferenceInMonth=new Array(
1272060, 1275495, 1281180, 1289445, 1299225, 1310355,
1321560, 1333035, 1342770, 1350855, 1356420, 1359045,
1358580, 1355055, 1348695, 1340040, 1329630, 1318455,
1306935, 1297380, 1286865, 1278430, 1274550, 1271556);
var DifferenceInYear=31556926;
var BeginTime=new Date(1901/1/1);
BeginTime.setTime(947120460000);
for(;DateGL.getFullYear()<BeginTime.getFullYear();){
BeginTime.setTime(BeginTime.getTime()-DifferenceInYear*1000);
}
for(;DateGL.getFullYear()>BeginTime.getFullYear();){
BeginTime.setTime(BeginTime.getTime()+DifferenceInYear*1000);
}
for(var M=0;DateGL.getMonth()>BeginTime.getMonth();M++){
BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000);
}
if(DateGL.getDate()>BeginTime.getDate()){
BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000);
M++;
}
if(DateGL.getDate()>BeginTime.getDate()){
BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000);
M==23?M=0:M++;
}
var JQ=" ";
if(DateGL.getDate()==BeginTime.getDate()){
JQ+=" 今天 <font color='#8B0000'>"+SolarTermStr[M]+"</font>";
}
else if(DateGL.getDate()==BeginTime.getDate()-1){
JQ+="  明天 <font color='red'><b>"+SolarTermStr[M]+"</b></font>";
}
else if(DateGL.getDate()==BeginTime.getDate()-2){
JQ+="  后天 <font color='red'><b>"+SolarTermStr[M]+ "</b></font>";
}

else {
JQ=" ";
if(DateGL.getMonth()==BeginTime.getMonth()){
JQ+=" 本月";
}
else{
JQ+=" 下月";
}
JQ+=BeginTime.getDate()+"日"+"<font color='blue'>"+SolarTermStr[M]+"</font>";
}

return JQ;
}

【代码未查到作者,因此没办法注明来源!】
其中公农历转换16进制数组说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//用1997年举例:
// CnData前四个数据是 0x16 0x2a 0xda 0x00
// 第一个字节0x16共8位
// 第1位表示第一个月是冬月[0]还是腊月[1]
// 后7位表示第一天的日期
//即:
// 0x16 = 0001 0110 1997年第一个月是冬月22,其中22对应后七位001 0110,左边第一位0,对应冬月

// 第二三字节0x2a 0xda
// 0x2a 0xda = 0010 1010 1101 1010 共16位 余下4位可继续表示后面连续四个月情况
// 前12位,每一位表示全年大小月情况 小月29天[0], 大月30天[1]
// 冬 腊 正 二 三 四 五 六 七 八 九 十 冬 腊 正 二
// 小 小 大 小 大 小 大 小 大 大 小 大 大 小 大 小
// 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0

// 第四个字节0x00共8位
// 表示闰月情况,0表示不闰月, 1998年0x05表示润五月

// 又如1998年:
// 0x83,0x49,0xb6,0x05
// 0x83 = 1000 0011 1998年第一个月是腊月初3,其中3对应000 0011
// 0x49,0xb6 = 0100 1001 1011 0110
// 腊 正 二 三 四 五 润五 六 七 八 九 十 冬 腊 正 二
// 小 大 小 小 大 小 小 大 大 小 大 大 小 大 大 小
// 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0
// 0x05 = 润五月

//其他对应:
// 0x83 = 1000 0011 1998年第一个月是腊月初3,其中3对应000 0011
// 0x0e = 0000 1110 1999年第一个月是冬月14,其中14对应000 1110
// 0x19 = 0001 1001 2000年第一个月是冬月25,其中25对应001 1001

// 0x87 = 1000 0111 2020年第一个月是腊月初7,其中7对应000 0111
// 0x12 = 0001 0010 2021年第一个月是冬月18,其中25对应001 0010

// 2021年
// 0x12,0xba,0x55,0x00
// 0x12 = 0001 0010,2021年第一个月是冬月18,其中冬月对应--0,18对应--001 0010,
// 0x5a,0xaa = 0101 1010 1010 1010
// 0x00 = 无闰月

二、html页面引用

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<title>公农历转换及24节气计算</title>
<script type='text/javascript' src='./js/date_new.js'></script>
</head>
<body>
今天是 <script type="text/javascript">RunGLNLJQ();</script>
</body>
</html>