js之阳历 → 农历(含时辰)转换函数

复制代码
使用方法

// 公历:1995年6月15日 8点

var result = solarToLunar(1995, 6, 15, 8);

console.log(result.lunarString);

// 输出:一九九五年五月十八日 08:00-08:59辰时

console.log(result);

// 会返回完整农历对象

复制代码
// ==============================
	// 独立提取:公历转农历(含时辰)
	// 调用示例:solarToLunar(1995, 5, 20, 8)
	// ==============================
	function solarToLunar(year, month, day, hour) {
    var lunarInfo = new Array(
	        0x4bd8, 0x4ae0, 0xa570, 0x54d5, 0xd260, 0xd950, 0x5554, 0x56af, 0x9ad0, 0x55d2, 0x4ae0, 0xa5b6, 0xa4d0, 0xd250, 0xd295, 0xb54f, 0xd6a0, 0xada2, 0x95b0, 0x4977, 0x497f, 0xa4b0, 0xb4b5, 0x6a50, 0x6d40, 0xab54, 0x2b6f, 0x9570, 0x52f2, 0x4970, 0x6566, 0xd4a0, 0xea50, 0x6a95, 0x5adf, 0x2b60, 0x86e3, 0x92ef, 0xc8d7, 0xc95f, 0xd4a0, 0xd8a6, 0xb55f, 0x56a0, 0xa5b4, 0x25df, 0x92d0, 0xd2b2, 0xa950, 0xb557, 0x6ca0, 0xb550, 0x5355, 0x4daf, 0xa5b0, 0x4573, 0x52bf, 0xa9a8, 0xe950, 0x6aa0, 0xaea6, 0xab50, 0x4b60, 0xaae4, 0xa570, 0x5260, 0xf263, 0xd950, 0x5b57, 0x56a0, 0x96d0, 0x4dd5, 0x4ad0, 0xa4d0, 0xd4d4, 0xd250, 0xd558, 0xb540, 0xb6a0, 0x95a6, 0x95bf, 0x49b0, 0xa974, 0xa4b0, 0xb27a, 0x6a50, 0x6d40, 0xaf46, 0xab60, 0x9570, 0x4af5, 0x4970, 0x64b0, 0x74a3, 0xea50, 0x6b58, 0x5ac0, 0xab60, 0x96d5, 0x92e0, 0xc960, 0xd954, 0xd4a0, 0xda50, 0x7552, 0x56a0, 0xabb7, 0x25d0, 0x92d0, 0xcab5, 0xa950, 0xb4a0, 0xbaa4, 0xad50, 0x55d9, 0x4ba0, 0xa5b0, 0x5176, 0x52bf, 0xa930, 0x7954, 0x6aa0, 0xad50, 0x5b52, 0x4b60, 0xa6e6, 0xa4e0, 0xd260, 0xea65, 0xd530, 0x5aa0, 0x76a3, 0x96d0, 0x4afb, 0x4ad0, 0xa4d0, 0xd0b6, 0xd25f, 0xd520, 0xdd45, 0xb5a0, 0x56d0, 0x55b2, 0x49b0, 0xa577, 0xa4b0, 0xaa50, 0xb255, 0x6d2f, 0xada0, 0x4b63, 0x937f, 0x49f8, 0x4970, 0x64b0, 0x68a6, 0xea5f, 0x6b20, 0xa6c4, 0xaaef, 0x92e0, 0xd2e3, 0xc960, 0xd557, 0xd4a0, 0xda50, 0x5d55, 0x56a0, 0xa6d0, 0x55d4, 0x52d0, 0xa9b8, 0xa950, 0xb4a0, 0xb6a6, 0xad50, 0x55a0, 0xaba4, 0xa5b0, 0x52b0, 0xb273, 0x6930, 0x7337, 0x6aa0, 0xad50, 0x4b55, 0x4b6f, 0xa570, 0x54e4, 0xd260, 0xe968, 0xd520, 0xdaa0, 0x6aa6, 0x56df, 0x4ae0, 0xa9d4, 0xa4d0, 0xd150, 0xf252, 0xd520
	    );

var nStr1 = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
var nStr2 = new Array('初', '十', '廿', '卅');
var monthName = new Array("", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二");

function lYearDays(y) {
    var i, sum = 348;
    for (i = 0x8000; i > 0x8; i >>= 1) sum += (lunarInfo[y - 1900] & i) ? 1 : 0;
    return sum + leapDays(y);
}

function leapDays(y) {
    if (leapMonth(y)) return ((lunarInfo[y - 1899] & 0xf) == 0xf ? 30 : 29);
    else return 0;
}

function leapMonth(y) {
    var lm = lunarInfo[y - 1900] & 0xf;
    return (lm == 0xf ? 0 : lm);
}

function monthDays(y, m) {
    return ((lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
}

function Lunar(objDate, h) {
    var i, leap = 0, temp = 0;
    var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000;
    if (h > 23) offset++;
    for (i = 1900; i < 2100 && offset > 0; i++) {
        temp = lYearDays(i);
        offset -= temp;
    }
    if (offset < 0) {
        offset += temp;
        i--;
    }
    this.year = i;
    leap = leapMonth(i);
    this.isLeap = false;
    for (i = 1; i < 13 && offset > 0; i++) {
        if (leap > 0 && i == (leap + 1) && !this.isLeap) {
            --i;
            this.isLeap = true;
            temp = leapDays(this.year);
        } else {
            temp = monthDays(this.year, i);
        }
        if (this.isLeap && i == (leap + 1)) this.isLeap = false;
        offset -= temp;
    }
    if (offset == 0 && leap > 0 && i == leap + 1) {
        this.isLeap ? this.isLeap = false : this.isLeap = true; --i;
    }
    if (offset < 0) { offset += temp; --i; }
    this.month = i;
    this.day = offset + 1;
}

function cYear(y) {
    var s = nStr1[Math.floor(y / 1000)];
    s += nStr1[Math.floor((y % 1000) / 100)];
    s += nStr1[Math.floor((y % 100) / 10)];
    s += nStr1[y % 10];
    return s;
}

function cDay(d) {
    switch (d) {
        case 10: return '初十';
        case 20: return '二十';
        case 30: return '三十';
        default: return nStr2[Math.floor(d / 10)] + nStr1[d % 10];
    }
}

// 时辰
var hh = [
    "00:00-00:59早子", "01:00-01:59丑", "02:00-02:59丑",
    "03:00-03:59寅", "04:00-04:59寅", "05:00-05:59卯",
    "06:00-06:59卯", "07:00-07:59辰", "08:00-08:59辰",
    "09:00-09:59巳", "10:00-10:59巳", "11:00-11:59午",
    "12:00-12:59午", "13:00-13:59未", "14:00-14:59未",
    "15:00-15:59申", "16:00-16:59申", "17:00-17:59酉",
    "18:00-18:59酉", "19:00-19:59戌", "20:00-20:59戌",
    "21:00-21:59亥", "22:00-22:59亥", "23:00-23:59晚子"
];

var sDObj = new Date(year, month - 1, day);
var lDObj = new Lunar(sDObj, hour);
var lY = cYear(lDObj.year);
var lM = monthName[lDObj.month];
var lD = cDay(lDObj.day);
var lL = lDObj.isLeap ? '闰' : '';
var lS = (hour >= 0 && hour < 24) ? hh[hour] : '未知';

return {
    lunarString: lY + '年' + lL + lM + '月' + lD + '日 ' + lS + '时',
    lunarYear: lDObj.year,
    lunarMonth: lDObj.month,
    lunarDay: lDObj.day,
    isLeapMonth: lDObj.isLeap,
    hourText: lS
};
}
相关推荐
今天AI了吗1 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
风月说与山鬼1 小时前
三、大括号语法
前端·react.js
kyriewen1 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
TELL5211 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
Csvn2 小时前
🕰️ 闭包 + setTimeout 的 5 个经典陷阱:为什么定时器看到的永远不是最新的值?
前端
动词ing2 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习2 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
lilian2332 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
CarIise3 小时前
CSS选择器与样式关联
前端·css·tensorflow