js 万年历农历转阳历 方法_JavaScript实现公历转农历功能示例
本文实例讲述了JavaScript实现公历转农历功能。分享给大家供大家参考,具体如下:
完整代码(该源码使用在线工具http://tools.jb51.net/code/js进行了格式化处理,以便于读者阅读):
/p>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
公历转农历
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; //显示!
}
要保存一年的信息,其实只要两个信息就可以了:1.农历每个月的大小?
2.今年是否有闰月.
3.闰几月以及闰月的大小.
用一个整数来保存这些信息就足够了.
具体的方法是:用一位来表示一个月的大?
笤录俏?,小月记为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月大,其余月份?
?x1A95=1101010010101B),4月的后面那一个0表示的是闰4月?
幼诺哪歉?表示5月大.
这样就可以用一个数组来保存这些信息.
在我的JavaScript脚本程序中是用CalendarData[]这个数组来保存这些信息的.
下面就是公历转换成农历的具体算法:1.计算出所求时间到起始年正月初一的天数.
2.从起始年份开始,减去每一月的天数,一直到剩余天数没有下一个月多为止.
此时,CalendarData[]的下标到了多少,就是减去了多少年,用起始年份加上这个下标就可以得到农历年份,然后看减去了几个月.
如果本年不闰月或者闰月还在后面,就可以直接得到农历月份,如果在闰月月份数后面一个月,则这个月就是闰月,如果在闰月的后面,则要减去1 才能得到月份数.
剩余的天数就是农历日,农历时用(公历时+1)/2 就可以简单地得到了.
运行效果图如下:
PS:这里再为大家推荐几款日历相关在线工具供大家参考:
希望本文所述对大家JavaScript程序设计有所帮助。
js 万年历农历转阳历 方法_JavaScript实现公历转农历功能示例相关推荐
- js 万年历农历转阳历 方法_JS实现带阴历的日历功能详解
本文实例讲述了JS实现带阴历的日历功能.分享给大家供大家参考,具体如下: 工作中要写一个带阴历的日历,自己调研了怎么做日历. 一.表格行数问题 既然要显示日期表格的话,首先得知道这个表格有多少行多少列 ...
- js 万年历农历转阳历 方法_Python 农历公历算法转换
背景 日常用python处理各种数据分析工作,最近需要对历年春节期间的数据做一些对比工作,本来只是用了一个简单的日期数组来进行,但后来发现一些数据在农历日期进行对比的时候,会有一些有趣的规律,进而产生 ...
- JavaScript之js-calendar-converter插件的使用、日历、日期、转换、阳历、阴历、公历、农历、calendar
文章目录 前言 下载js-calendar-converter插件 插件介绍 查询属性表 获取的方法 转换的方法 设置的方法 微信小程序查看效果 日历选择案例 前言 在做算命项目时遇到公历和农历相互转 ...
- js中显示一个指定html文档,JS实现选定指定HTML元素对象中指定文本内容功能示例...
本文实例讲述了JS实现选定指定HTML元素对象中指定文本内容功能.分享给大家供大家参考,具体如下: 该功能用处多多,可以灵活运用之!主要函数如下: //选中文本中指定部分 function selec ...
- 如何将mysql的数据库渲染到页面_vue.js实现数据库的JSON数据输出渲染到html页面功能示例...
本文实例讲述了vue.js实现数据库的JSON数据输出渲染到html页面功能.分享给大家供大家参考,具体如下: 1.首先通过json.php把数据库给输出为json格式的数据 [ { "id ...
- html canvas直线进度条,js+HTML5 canvas 实现简单的加载条(进度条)功能示例
本文实例讲述了js+HTML5 canvas 实现简单的加载条(进度条)功能.分享给大家供大家参考,具体如下: www.jb51.net canvas实现加载条动画 /* * 获取canvas, ca ...
- js 万年历农历转阳历 方法_利用JS制作万年历的方法
本篇文章主要介绍了利用JS制作万年历的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 我们知道,万年历在人们的生活中是在平常不过的一种东西了,那么怎样用JS来实现在网 ...
- js 万年历农历转阳历 方法_非常酷的javascript实现万年历功能
body{ margin:0px; padding:0px; font-size:12px; line-height:22px; font-family:tahoma,"宋体",S ...
- js 根据公历日期 算出农历_一招教会你公历换算成农历,要不要试试看
古代的历法是干支纪年,俗称农历或阴历,现在我们都统一采用公历的阿拉伯数字纪年.因此,就存在着一个历法的换算问题.当然,我们可以查历书就直接知道了,但是这个方法并不一定方便.现在告诉大家一个简单的口诀, ...
最新文章
- 七十五、SpringBoot 的数据缓存cache(二)
- boost::pfr::get相关的测试程序
- window.open 实现session隔离_InnoDB存储引擎MVCC实现原理
- php接收vue请求数据axios,详解vue axios用post提交的数据格式
- 网络动态负载均衡算法分析
- android开发switch自动关闭,更改Android Switch状态
- matplotlib 对称图_Python入门向:Matplotlib自救指南篇,从此做图不求人(一)
- 编程之美第一篇 01分数规划
- mysql可视化工具选型
- 用nmap查看局域网存活的主机
- 【第4篇】人工智能(AI)语音测试原理和实践
- 今天睡眠质量记录88分
- 提问的价值,你了解多少?
- IOS根据文字计算laber的行数与长度
- STM32CubeMX SDRAM的使用(二)
- python编程实践(一):统计智联招聘数据
- Tableau图表制作-蝴蝶图
- 【微机原理与接口技术】之一微型计算机系统概述
- 程序员春招是什么时候?什么是金三银四?
- dhcp、tftp及pxe简介
热门文章
- SQL自动检查神器项目,吊炸天的功能
- 如何在微信中取消已授权的第三方应用APP
- 找质数算法之埃拉托色尼筛选法(Sieve of Eratosthenes算法)
- b站网页版没有html,b站网页版
- [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]
- C# Format详解
- Centos7 编译安装 图片压缩 MozJPEG
- centos8 U盘制作及安装
- 关于我在刷题时用OJ判题发现的cout相较于printf严重超时的问题
- 使用计算机视觉来做异常检测