看看我的主页,我的网页上除了显示公历之外,还可以显示农历:辛巳年(蛇)五月初十申时,比一般网站上简单的公历显示酷多了!
这究竟是怎么做的呢?耐心看我的文章吧!我们先看看最关键的公历农历转换算法,明白了原理以后就可以“举一反三”了。首先要保存公历农历之间的转换信息: 以任意一年作为起点,把从这一年起若干年(若干是多少?就看你的需要了)的农历信息保存起来(在我的JavaScript脚本中,是以2001年作为起点)。回想一下,我们平常是怎样来转换公历农历的呢?是查万年历,万年历有每一天的公历农历,直接一查就可以了。那么我们可不可以也这样做呢?当然可以,但是,这样做就要收录每一天的信息,工作量就会很大,所以我们要简化这些信息。怎么简化呢?要保存一年的信息,其实只要两个信息就可以了:1.农历每个月的大小;2.今年是否有闰月,闰几月以及闰月的大小。用一个整数来保存这些信息就足够了。具体的方法是:用一位来表示一个月的大小,大月记为1,小月记为0,这样就用掉12 位(无闰月)或13 位(有闰月),再用高4位来表示闰月的月份,没有闰月记为0。比如说,2 0 0 0 年的信息数据是0 x C 9 6 ,化成二进制就是110010010110B,表示的含义是指1、2、5、8、10、11月大,其余月小。2001 年的农历信息数据是0x41A95,其中4表示今年闰4月,月份大小信息就是0x1A95(因为闰月,所以有13 位),具体的就是1、2、4、5、8、10、12月大,其余月份小(0x1A95=1101010010101B),4月的后面那一个0表示的是闰4月小,接着的那个1表示5月大。这样就可以用一个数组来保存这些信息。在我的JavaScript脚本程序中是用CalendarData[]这个数组来保存这些信息的。下面就是公历转换成农历的具体算法:1.计算出所求时间到起始年正月初一的天数。2.从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止。此时,CalendarData[]的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月。如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月,如果在闰月的后面,则要减去1 才能得到月份数。剩余的天数就是农历日,农历时用(公历时+1)/2 就可以简单地得到了。
具体的date.js 代码如下:
var CalendarData=new Array(20);
var madd=new Array(12);
var TheDate=new Date();
var tgString="甲乙丙丁戊己庚辛壬癸";
var dzString="子丑寅卯辰巳午未申酉戌亥";
var numString="一二三四五六七八九十";
var monString="正二三四五六七八九十冬腊";
var weekString="日一二三四五六";
var sx="鼠牛虎兔龙蛇马羊猴鸡狗猪";
var cYear;
var cMonth;
var cDay;
var cHour;
var cDateString;
var DateString;
var Browser=navigator.appName;
function init()
{
CalendarData[0]=0x41A95;
CalendarData[1]=0xD4A;
CalendarData[2]=0xDA5;
CalendarData[3]=0x20B55;
CalendarData[4]=0x56A;
CalendarData[5]=0x7155B;
CalendarData[6]=0x25D;
CalendarData[7]=0x92D;
CalendarData[8]=0x5192B;
CalendarData[9]=0xA95;
CalendarData[10]=0xB4A;
CalendarData[11]=0x416AA;
CalendarData[12]=0xAD5;
CalendarData[13]=0x90AB5;
CalendarData[14]=0x4BA;
CalendarData[15]=0xA5B;
CalendarData[16]=0x60A57;
CalendarData[17]=0x52B;
CalendarData[18]=0xA93;
CalendarData[19]=0x40E95;
madd[0]=0;
madd[1]=31;
madd[2]=59;
madd[3]=90;
madd[4]=120;
madd[5]=151;
madd[6]=181;
madd[7]=212;
madd[8]=243;
madd[9]=273;
madd[10]=304;
madd[11]=334;
}
function GetBit(m,n)
{
return (m>>n)&1;
}
function e2c()
{
var total,m,n,k;
var isEnd=false;
var tmp=TheDate.getYear();
if (tmp<1900) tmp+=1900;
total=(tmp-2001)*365
+Math.floor((tmp-2001)/4)
+madd[TheDate.getMonth()]
+TheDate.getDate()
-23;
if (TheDate.getYear()%4==0&&TheDate.
getMonth()>1)
total++;
for(m=0;;m++)
{
k=(CalendarData[m]<0xfff)?11:12;
for(n=k;n>=0;n--)
{
if(total<=29+GetBit(CalendarData[m],
n))
{
isEnd=true;
break;
}
total=total-29-GetBit(CalendarData
[m],n);
}
if(isEnd)break;
}
cYear=2001 + m;
cMonth=k-n+1;
cDay=total;
if(k==12)
{
if(cMonth==Math.floor(CalendarData
[m]/0x10000)+1)
cMonth=1-cMonth;
if(cMonth>Math.floor(CalendarData[m]/
0x10000)+1)
cMonth--;
}
cHour=Math.floor((TheDate.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+=dzString.charAt((cHour-1)%12);
tmp+="时";
cDateString=tmp;
return tmp;
}
function GetDateString()
{
var tmp="";
var t1=TheDate.getYear();
if (t1<1900)t1+=1900;
tmp+=t1
+"-"
+(TheDate.getMonth()+1)+"-"
+TheDate.getDate()+" "
+TheDate.getHours()+":"
+((TheDate.getMinutes()<10)?"0":"")
+TheDate.getMinutes()
+" 星期"+weekString.charAt
(TheDate.getDay());
DateString=tmp;
return tmp;
}
init();
e2c();
GetDateString();
GetcDateString();
document.write(DateString,"<br>",cDateString);
你可以这样写一个HTML文件调
用date.js:
<html>
<head>
</head>
<body>
<script language="JavaScript"
src="date.js"></script>
</body>
</html>
分享到:
相关推荐
调用简单,下拉传一日期加类型即可转换日期的类型,如: CalConvert(new Date(2010,3,19), false) //农历转换为公历 CalConvert(new Date(2010,3,19), true)//公历转换成农历
公历转换农历的算法(JavaScript) 公历转换农历的算法是指将公历日期转换为农历日期的过程。公历是国际通用的日期系统,而农历则是中国传统的日期系统。农历的日期系统与公历不同,它的日期是根据月亮的周期变化而...
这种情况下选择生日就有点牵强,本人最近在做的一个项目中需要用户输入自己的生日,既可选择公历,也可选择农历,经过研究做出了这种生日选择器,可以任意切换公历和农历,公历农历相互转换的算法90%是本人原创,...
在JavaScript中,`moment.js`或`date-fns`库可以帮助处理日期,`chinese-calendar`库则提供了农历转换功能。 4. **测试**:确保转换的准确性和一致性,需要编写大量的测试用例,包括常规日期、闰年、闰月、特殊日期...
- 农历转换的算法可能会因地区而略有差异,如中国的农历与越南、韩国的农历不尽相同,需要根据具体需求调整。 - 由于农历与公历之间的转换涉及大量计算,性能优化也是需要考虑的问题,特别是在处理大量数据时。 ...
PHP实现公历和农历之间的转换 一、开发环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。 二、主要技术 本实验主要使用JS类库和公历转农历的类库实现。
为解决Web前端的农历转换,现将相关的前端转换代码共享给大家,JavaScript公历转换、农历转换、阴历转换、阳历转换
如Python的`pandas`和`python-lunar-calendar`,Java的`java.util.Calendar`和第三方库`lunardate`,JavaScript的`moment.js`和`chinese-calendar`等,它们通常已经实现了公历和农历的转换函数。 5. **前端展示**:...
"js农历日期.rar"可能是一个包含资源的压缩包,其中的"js农历日期.html"可能是展示或实现JavaScript农历日期转换的一个示例文件。下面将详细讨论JavaScript处理农历日期的相关知识点。 1. **JavaScript内置日期对象...
在这个“易语言JS取农历日期”的项目中,我们主要关注的是如何在易语言环境中利用JavaScript获取并转换农历日期。 JavaScript是一种广泛应用于网页和网络应用的脚本语言,它通常与HTML和CSS一起工作,用于创建动态...
3. **ChineseDate类**:在描述中提到的`ChineseDate`类就是用于公历到农历转换的核心组件。它接受一个`Date`对象(Flex中的内置类型,代表公历日期)作为构造函数的参数,然后通过内部的算法计算出对应的农历日期。`...
在JavaScript中,我们可以创建一个自定义的类或函数来处理农历转换。这个类通常会包含以下功能: 1. **农历日期到公历日期的转换**:这个过程涉及到农历的月份、日期和年份与公历的对应转换。可以使用一些已知的...
公历(阳历) 农历(阴历)转换,支持时间段从 1900-2100 如果需要更长的时间段,利用 generate.htm 生成的数据即可。 支持各种编程语言 C#,java,Objective-C,php,Python,javascript(nodejs),C/C++,ruby,swift,golang 等...
农历转公历,公历转农历,做日历的朋友会需要的东西能转换1936-2031年的日期,支持农历转公历,公历转农历,经过简单的修改就可以符合自己的开发要求!
- 对于JavaScript,可以使用`moment.js`库的扩展插件`moment-lunar`等。 5. **国历与农历转换单元的应用**: - 在开发日历应用、传统节日提醒、数据分析等场景中,这种转换功能非常关键。 - 社交媒体、新闻APP等...
首先,`calendar.js`可能是实现农历转换的核心代码文件,它可能包含了从公历到农历的转换算法。这些算法通常基于一系列的公式和表,如“润月规则”和“节气计算”。在JavaScript中,我们可以创建函数来处理这些计算...
通过创建一个类(或称为构造函数),我们可以封装农历转换和计算的逻辑,提供更易于理解和维护的代码。 2. **农历算法**:农历的计算涉及到复杂的历法规则,包括闰月、节气、生肖和年号的处理。JavaScript库通常会...
"带农历的js日期显示(包含农历闰月)"是一个专门用于处理农历日期的JavaScript函数库,它提供了丰富的功能,如显示天干、地支、属相以及时辰等,还能够准确判断农历的闰月情况。 首先,让我们了解一下农历的基础...
用户可下载当前文件之后,可以获取时间戳数据传进JS文件中的函数,函数处理完时间戳之后会返回当前对应的事件农历日期(中文形式),VUE时间戳转农历js文件
微信小程序虽然提供了基础的日期处理功能,但农历的转换可能需要借助第三方库,如`npm`上的`chinese-calendar-converter`,它可以方便地进行农历和阳历之间的转换。 在实际开发中,为了提升用户体验,还可以考虑...