JavaScript实现公历转农历功能示例


Posted in Javascript onFebruary 13, 2017

本文实例讲述了JavaScript实现公历转农历功能。分享给大家供大家参考,具体如下:

完整代码(该源码使用在线工具http://tools.3water.com/code/js进行了格式化处理,以便于读者阅读):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>公历转农历</title>
<script type="text/javascript" language="javascript" >
var CalendarData = new Array(20);
var madd = new Array(12);
var TheDate;
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; //公元2001年;
  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;
} //n月是大月还是小月?
function getInfo() { //用户输入日期!
  var arr = [];
  strData = prompt("请输入年 月 日,并以空格隔开!", "");
  if (strData == null || strData == "") {
    alert("输入错误!请刷新!");
    return false;
  }
  arr = strData.split(" ");
  y = arr[0];
  m = arr[1] - 1;
  d = arr[2];
  TheDate = new Date(y, m, d);
} //getinfo();
function e2c() {
  getInfo();
  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; //2001年1月23是除夕;该句计算到起始年正月初一的天数
  if (TheDate.getYear() % 4 == 0 && TheDate.getMonth() > 1) total++; //当年是闰年且已过2月再加一天!
  for (m = 0;; m++) {
    k = (CalendarData[m] < 0xfff) ? 11 : 12; //起始年+m闰月吗?
    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() + 1) / 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 == 12) tmp += "夜";
  tmp += dzString.charAt((cHour) % 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;
}
function cnCanlender() {
  init();
  e2c();
  GetDateString();
  GetcDateString();
  strcnCanlender.innerText = DateString + "\n" + cDateString; //显示!
}
</script>
</head>
<body>
要保存一年的信息,其实只要两个信息就可以了:1.农历每个月的大小?<br/>2.今年是否有闰月.<br/>3.闰几月以及闰月的大小.<br/><br/>用一个整数来保存这些信息就足够了.<br/>具体的方法是:用一位来表示一个月的大?<br/> 笤录俏?,小月记为0,这样就用掉12 位(无闰月)或13 位(有闰月),再用高4位来表示闰月的月份,没有闰月记为0.<br/>比如说,2 0 0 0 年的信息数据是0 x C 9 6 ,化成二进制就是110010010110B,表示的含义是指1、2、5、8、10、11月大,其余月小.<br/>2001 年的农历信息数据是0x41A95,其中4表示今年闰4月,月份大小信息就是0x1A95(因为闰月,所以有13 位),具体的就是1、2、4、5、8、10、12月大,其余月份?<br/>?x1A95=1101010010101B),4月的后面那一个0表示的是闰4月?<br/> 幼诺哪歉?表示5月大.<br/>这样就可以用一个数组来保存这些信息.<br/>在我的JavaScript脚本程序中是用CalendarData[]这个数组来保存这些信息的.<br/>下面就是公历转换成农历的具体算法:1.计算出所求时间到起始年正月初一的天数.<br/>2.从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止.<br/>此时,CalendarData[]的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月.<br/>如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月,如果在闰月的后面,则要减去1 才能得到月份数.<br/>剩余的天数就是农历日,农历时用(公历时+1)/2 就可以简单地得到了.<br/> 
<hr color="#00ff00"/>
<input type="button" value="开始转换" onclick="cnCanlender()"/>
<div id="strcnCanlender" name="strcnCanlender">
</div>
</body>
</html>

运行效果图如下:

JavaScript实现公历转农历功能示例

Javascript 相关文章推荐
JavaScript语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
JQuery 学习笔记 选择器之五
Jul 23 Javascript
jquery 查找select ,并触发事件的实现代码
Mar 30 Javascript
JavaScript学习笔记之内置对象
Jan 22 Javascript
js实现简单选项卡与自动切换效果的方法
Apr 10 Javascript
简介JavaScript中search()方法的使用
Jun 06 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
Jun 28 Javascript
jquery结合html实现中英文页面切换
Nov 29 Javascript
js实现九宫格的随机颜色跳转
Feb 19 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
Aug 13 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 #Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 #Javascript
JS中input表单隐藏域及其使用方法
Feb 13 #Javascript
浅谈键盘上回车按钮的js触发事件
Feb 13 #Javascript
jQuery源码分析之init的详细介绍
Feb 13 #Javascript
AngulerJS学习之按需动态加载文件
Feb 13 #Javascript
JavaScript获取ul中li个数的方法
Feb 13 #Javascript
You might like
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
抓取YAHOO股票报价的类
2009/05/15 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
python实现排序算法
2014/02/14 Python
python多线程抓取天涯帖子内容示例
2014/04/03 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
Django stark组件使用及原理详解
2019/08/22 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
后勤工作职责
2013/12/22 职场文书
三年级数学教学反思
2014/01/31 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
Python OpenCV 图像平移的实现示例
2021/06/04 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js