/*
首先,保存公历农历之间的转换信息:以任意一年作为起点,把从这一年起若干年(依需要而定)的农历信息保存起来.
要保存一年的信息,只要两个信息就够了:1.农历每个月的大小;2.今年是否有闰月,闰几月以及闰月的大小.用一个整数来保存这些信息就足够了.具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉12位(无闰月)或13位(有闰月),再用高四位来表示闰月的月份,没有闰月记为0.例如:2000年的信息数据是0xc96,化成二进制就是110010010110B,表示的含义是:1,2,5,8,10,11月大,其余月份小.2001年的农历信息数据是0x1a95(因为闰月,所以有13位),具体的就是1,2,4,5,8,10,12月大,其余月份小(0x1a95=1101010010101B),4月的后面那一个0表示的是闰4月小,接着的那个1表示5月大.这样就可以用一个数组来保存这些信息.
在这里用数组CalendarDate[]来保存这些信息.
具体算法:
1.计算处所求时间到起始年正月初一的天数.
2.从起始年份开始,减去每一月的天数,一直到剩余的天数没有下一个多为止.此时,CalendarDate[]的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月.如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月份数后面一个月,则这个月就是闰月,如果在闰月的后面,则要减去1才能得到月份数.剩余的天数就是农历日,农历时用(公历时+1)/2就可以简单的得到了.具体代码如下:
公历转换农历
*/
var CalendarDate=new Array(20);
var madd=new Array(12);
var day=new Date();
var tgString="甲乙丙丁戊己庚辛壬癸";
var dzString="子丑寅卯辰巳午未申酉戌亥";
var numString="一二三四五六七八九十";
var monString="正二三四五六七八九十冬腊";
var weekString="日一二三四五六";
var sx="鼠牛虎兔龙蛇马羊猴鸡狗猪";
var cYear;
var cMonth;
var cHour;
var cDateString;
var DateString;
function e2c()
{
var total,m,n,k;
var isEnd=false;
var tmp=day.getYear();
if (tmp<1900)
tmp+=1900;
total=(tmp-2001)*365+Math.floor((tmp-2001)/4)+madd[day.getMonth()]+day.getDate()-23;
if (day.getYear()%4==0 && day.getMonth()>1)
total++;
for (m=0;m>=0;m++)
{
k=(CalendarDate[m]<0xfff)?11:12;
for (n=k;n>=0;n--)
{
if (total<=29+GetBit(CalendarDate[m],n))
{
isEnd=true;
break;
}
total=total-29-GetBit(CalendarDate[m],n);
}
if (isEnd)
break;
}
cYear=2001+m;
cMonth=k-n+1;
cDay=total;
if (k==12)
{
if (cMonth==Math.floor(CalendarDate[m]/0x10000+1))
cMonth=1-cMonth;
if (cMonth>Math.floor(CalendarDate[m]/0x10000+1))
cMonth--;
}
cHour=Math.floor((day.getHours()+3)/2);
}
function GetcDateString()
{
var tmp="";
tmp+=tgString.charAt((cYear-4)%10);//年干
tmp+=dzString.charAt((cYear-4)%12);//年支
tmp+="(";
tmp+=sx.charAt((cYear-4)%12);
tmp+=")年";
if (cMonth<1)
{
tmp+="闰";
tmp+=monString.charAt(-cMonth-1);
}
else
tmp+=monString.charAt(cMonth-1);
tmp+="月";
tmp+=(cDay<11)?"初":((cDay<20)?"十":((cDay<30)?"甘":"卅"));
if (cDay%10!=0||cDay==10)
tmp+=numString.charAt((cDay-1)%10);
if (cHour==13)
tmp+="夜";
tmp+=" "
tmp+=dzString.charAt((cHour-1)%12);
tmp+="时";
cDateString=tmp;
}
function GetDateString()
{
var today=new Date();//时间循环时一定要是内部变量
var t1=today.getYear();
var time
time=t1+"-"
time+=(today.getMonth()+1)+"-"
time+=today.getDate()+" "
time+="星期"+weekString.charAt(today.getDay())+" "
time+=today.getHours()+":"
time+=(today.getMinutes()<10)?"0":""
time+=today.getMinutes()+":"
time+=(today.getSeconds()<10)?"0":""
time+=today.getSeconds()+" "
time+=(today.getHours()<=12&&today.getHours()>0)?"AM":"PM"
DateString=time;
document.time.showtime.value=time;
setTimeout('GetDateString()', 1000);
}
function chinatime()
{
alert("现在农历是:"+cDateString);
}