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 相关文章推荐
Jquery Autocomplete 结合asp.net使用要点
Oct 29 Javascript
jquery蒙版控件实现代码
Dec 08 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
js 事件的传播机制(实例讲解)
Jul 20 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
Sep 22 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 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
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
php5与php7的区别点总结
2019/10/11 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
numpy返回array中元素的index方法
2018/06/27 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
python flask搭建web应用教程
2019/11/19 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
会议邀请函范文
2014/01/09 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
工程催款通知书
2015/04/17 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫