CoffeeCat's IT Blog

Javascript阳历转阴历程序(07年最新更新)

 

2007年11月10日最新修改
感谢daisylh的完善,请在miy=i;下加上break;
添加了对Firefox的支持,请在var yy=D.getYear();下加上 if ( navigator.appName == "Netscape" ) yy += 1900;
 
  注:07年即将过去,本程序也即将过期了,不过令人高兴的是,
daisylh已经将程序完善到2020年,并且一直维护着,您可以前往 http://www.cnblogs.com/daisylh/archive/2007/03/31/694892.html 找到更新程序。

2007年2月27日最新修改
感谢VaneyLee的提醒,现在程序已经修改,现在没有问题了。

由于当初我写的时候是下午16:30分,所以当我把时钟调到年初一的时候,也是16:30分,由于疏忽,所以将年初一16:30分的时间记录为07年初始时间了,所以导致了如果您在16:30分以前看的话,就是上一天了。

程序红色黑体部分是修改的部分。

    感谢daisylh的完善,daisylh将程序完善到2020年,您可以访问他的博客查看。
    “http://www.cnblogs.com/daisylh/archive/2007/03/31/694892.html”





昨天,在百度知道上帮人家回答了一个问题,解决了人家网站上阳历转阴历的错误。

错误在于这个javascript程序使用的是枚举法来转换阴历阳历,使得这个程序只能使用到2006年。由于这个程序比较简单,所以我根据了一些阴历的常识,对程序进行了修改,现在程序能用到2007年。

不过让我很寒心,提问者选了这样一个最佳答案:“我的QQ是XXXXX,我帮你解决。”我想,就算那人真的帮你解决了问题,可这样写有意思么,如果别人也遇到了这个问题,能再得到帮助吗?不说了。

 

 

下面给出这个程序的代码,修改的地方我用红色表示出来了,并适当做了注释,相信有点编程能力的人都能看懂,并能自己修改了。

把这段代码插入到你想显示的位置就可以了。最底下黄色的语句就是用于显示的CAL函数,你可以根据实际情况进行修改。

<script language=JavaScript>
 
<!--
var bsYear;
var bsDate;
var bsWeek;
var arrLen=9; //数组长度
var sValue=0; //当年的秒数
var dayiy=0; //当年第几天
var miy=0; //月份的下标
var iyear=0; //年份标记
var dayim=0; //当月第几天
var spd=86400; //每天的秒数

var year1999="30;29;29;30;29;29;30;29;30;30;30;29"; //354
var year2000="30;30;29;29;30;29;29;30;29;30;30;29"; //354
var year2001="30;30;29;30;29;30;29;29;30;29;30;29;30"; //384
var year2002="30;30;29;30;29;30;29;29;30;29;30;29"; //354
var year2003="30;30;29;30;30;29;30;29;29;30;29;30"; //355
var year2004="29;30;29;30;30;29;30;29;30;29;30;29;30"; //384
var year2005="29;30;29;30;29;30;30;29;30;29;30;29"; //354
var year2006="30;29;30;29;30;30;29;29;30;30;29;29;30"; //384
var year2007="29;29;30;29;29;30;29;30;30;30;29;30"; //这个表示2007年阴历每月的天数。注意,由于2006年是阴历闰年,所以有13个月,而2007年不是闰年。

var month1999="正月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月"
var month2001="正月;二月;三月;四月;闰四月;五月;六月;七月;八月;九月;十月;十一月;十二月"
var month2004="正月;二月;闰二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月"
var month2006="正月;二月;三月;四月;五月;六月;七月;闰七月;八月;九月;十月;十一月;十二月"

//这里是闰年的表示,如果不是闰年,就不需要加了。主要注意带闰字的月。

var Dn="初一;初二;初三;初四;初五;初六;初七;初八;初九;初十;十一;十二;十三;十四;十五;十六;十七;十八;十九;二十;廿一;廿二;廿三;廿四;廿五;廿六;廿七;廿八;廿九;三十";

var Ys=new Array(arrLen);
Ys[0]=919094400;Ys[1]=949680000;Ys[2]=980265600;
Ys[3]=1013443200;Ys[4]=1044028800;Ys[5]=1074700800;
Ys[6]=1107878400;Ys[7]=1138464000;
Ys[8]=1171728000;//这个数字是大年初一0:00的时候,javascript的D.getTime() / 1000的值

var Yn=new Array(arrLen); //农历年的名称
Yn[0]="己卯年";Yn[1]="庚辰年";Yn[2]="辛巳年";
Yn[3]="壬午年";Yn[4]="癸未年";Yn[5]="甲申年";
Yn[6]="乙酉年";Yn[7]="丙戌年";
Yn[8]="丁亥年";

var D=new Date();
var yy=D.getYear();

if ( navigator.appName == "Netscape" ) yy+= 1900;    //Firefox支持

var mm=D.getMonth()+1;
var dd=D.getDate();
var ww=D.getDay();

if (ww==0) ww="<font color=#EACF4F> 星期日 ";
if (ww==1) ww=" 星期一 ";
if (ww==2) ww=" 星期二 ";
if (ww==3) ww=" 星期三 ";
if (ww==4) ww=" 星期四 ";
if (ww==5) ww=" 星期五 ";
if (ww==6) ww="<font color=#EACF4F> 星期六 ";
ww=ww;
var ss=parseInt(D.getTime() / 1000);


if (yy<100) yy="19"+yy;

for (i=0;i<arrLen;i++)
if (ss>=Ys[i]){
iyear=i;
sValue=ss-Ys[i]; //当年的秒数
}

dayiy=parseInt(sValue/spd)+1; //当年的天数

var dpm=year1999;

if (iyear==1) dpm=year2000;
if (iyear==2) dpm=year2001;
if (iyear==3) dpm=year2002;
if (iyear==4) dpm=year2003;
if (iyear==5) dpm=year2004;
if (iyear==6) dpm=year2005;
if (iyear==7) dpm=year2006;
if (iyear==8) dpm=year2007;

dpm=dpm.split(";");

var Mn=month1999;
if (iyear==2) Mn=month2001;
if (iyear==5) Mn=month2004;
if (iyear==7) Mn=month2006;
Mn=Mn.split(";");

var Dn="初一;初二;初三;初四;初五;初六;初七;初八;初九;初十;十一;十二;十三;十四;十五;十六;十七;十八;十九;二十;廿一;廿二;廿三;廿四;廿五;廿六;廿七;廿八;廿九;三十";
Dn=Dn.split(";");

dayim=dayiy;


var total=new Array(13);
total[0]=parseInt(dpm[0]);
for (i=1;i<dpm.length-1;i++) total[i]=parseInt(dpm[i])+total[i-1];
for (i=dpm.length-1;i>0;i--)
if (dayim>total[i-1]){
dayim=dayim-total[i-1];
miy=i; 

break;

}

bsWeek=ww;
bsDate=yy+"年"+mm+"月";
bsDate2=dd+"日";
bsYear="农历"+Yn[iyear];
bsYear2=Mn[miy]+Dn[dayim-1];

if (ss>=Ys[8]||ss<Ys[0]) bsYear=Yn[8];

function CAL(){
document.write("<font color=#9A172D>"+bsDate+"</font><font color=#9A172D>"+bsDate2+"</font><font color=#9A172D>");
document.write(bsWeek+"<font color=#9A172D>");
document.write(bsYear+bsYear2);
}

//-->
              </script>
                <script language=javascript>CAL();</script>

posted on 2007-02-23 17:36 CoffeeCat 阅读(4611) 评论(20)  编辑 收藏 引用

评论

# re: Javascript阳历转阴历程序(07年最新更新) 2007-02-26 15:25 VaneyLee

有问题。
比如今天显示的是:“2007年2月26日 星期一 丁亥年正月初八”
但是实际上应该是:“2007年2月26日 星期一 丁亥年正月初九”

农历还是有问题。请尽快解决。谢谢。  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-02-26 15:51 VaneyLee

dayiy=parseInt(sValue/spd)+2; //当年的天数 【暂时解决方法:将+1改为+2】

我将代码中的
“dayiy=parseInt(sValue/spd)+1”改为
“dayiy=parseInt(sValue/spd)+2”
可以正确显示农历。2007年的显示应该没问题了。  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-02-27 13:03 CoffeeCat

问题已经解决,谢谢您的提醒。

另,您的解决方法不完全正确,原因是我把16:30记录为一天开始的时间,所以如果您+1的话,那您的程序在16:30以后就会显示第二天的阴历了。  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-03 10:46 Vaneylee

非常欣赏CoffeeCat认真负责的态度!

我之前用的“Javascript阳历转阴历程序”就是因为只能用到2006年(正如CoffeeCat在文章中所说的:“这个javascript程序使用的是枚举法来转换阴历阳历,使得这个程序只能使用到2006年”),所以通过百度搜索才找到这里来的。

其实在找到这来之前,我自己也尝试着去修改这段Javascript程序。我修改的代码跟CoffeeCat所改的完全一样,只是在“Ys[8]=1171728000”这里,我就懵了。因为我不知道这个数字是什么意思。我还尝试着用计算器把这些数字去除以当年的天数,试图发现什么规律。在这里,也向CoffeeCat请教下“Ys[8]=1171728000”是怎么得来的?“这个数字是大年初一0:00的时候,javascript的D.getTime() / 1000的值”的详细意思是?

另外:
我将代码中的
“dayiy=parseInt(sValue/spd)+1”改为
“dayiy=parseInt(sValue/spd)+2”
可以正确显示农历(我是乱试出来的)。而且我不断调整电脑的日期,并且对照手机的日历,2007年的显示应该没问题了。
CoffeeCat在回复中说:"您的程序在16:30以后就会显示第二天的阴历了。"我在上午去看这个农历,好像也是正确的,哈哈。

当然按CoffeeCat“Ys[8]=1171728000”的来才是正解!  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-03 10:54 Vaneylee

忘了说了,我的QQ是:278125016。
加的时候请注明:CoffeeCat。
希望CoffeeCat能够加下我。哈哈。  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-03 16:30 CoffeeCat

回 Vaneylee :

Ys数组记录的是每个农历年开始的时间。

至于这个时间为什么用整数表示呢?因为在Javascript中,可以用整数来表示时间,这个整数就是距离1970年1月1号的毫秒数。所以,用D.getTime()可以得到当前时间距离1970年1月1号的毫秒数。当然,用这个整数值可以很方便的转换成当前的时间。其中的D是一个Date对象。

除以1000很好理解,就是将毫秒转换成秒。  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-03 16:35 CoffeeCat

引用 Vaneylee 的
我在上午去看这个农历,好像也是正确的,哈哈


呵呵,你改成+2以后晚上再运行看看,应该就快一天了  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-03 19:22 Administrator

果然是JavaScript高手,请问如何学会这么高难度的程序的呢?可否提供一下教程给小弟学习学习呀?我的QQ为:199248375 谢谢!!  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-04 09:25 CoffeeCat

Administrator

您过奖了。我没有系统的学过Javascript,其实Javascript和C语言语法很相似,并且提供了很多对象,所以如果您学习过Java的话,Javascript入门很快的。

至于教程,我没有看过,所以不敢妄然推荐,呵呵。

  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-07 11:03 daisylh

感謝!
今天才發現,在發愁呢~也是困到1171728000的計算這裏了
還是不明白它到底咋計算的?
如果是2008年會是多少呢?2009?2010?...  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-07 19:02 CoffeeCat

回daisylh
举个例子
要得到2008年的这个数值,请先将系统时钟调到农历2008年大年初一的凌晨0:00分,然后运行下面这个网页,那么在浏览器上显示出来的,就是你要的数字。



<body>
<script language="javascript">
<!--
var D=new Date();
document.write(parseInt(D.getTime() / 1000));
-->
</script>
</body>

  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-08 10:05 daisylh

非常感謝你~
稍後嘗試^__^  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新)[未登录] 2007-03-15 17:05 gg

能不能多做几年的啊,非常感谢!!^_^  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-17 20:46 CoffeeCat

好,我尽快更新  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新)[未登录] 2007-03-23 13:46 dolphin

爱死搂主了~~
真是大好人啊!!!
  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-31 13:42 daisylh

根據LZ的分享,我推算至2020年:http://www.cnblogs.com/daisylh/archive/2007/03/31/694892.html  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-03-31 16:42 CoffeeCat

非常感谢你!  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-11-09 13:37 daisylh

今天的農歷不準確了@_@  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-11-09 14:05 daisylh

原來在miy=i; 後要加break;就OK啦
  回复  更多评论   

# re: Javascript阳历转阴历程序(07年最新更新) 2007-11-10 09:28 CoffeeCat

@daisylh
非常感谢您!
另外,我修复了程序在Firefox下显示年份的问题。  回复  更多评论   

只有注册用户登录后才能发表评论。
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

公告

常用链接

留言簿(203)

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜