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
};
}
相关推荐
_瑞2 分钟前
深入理解 iOS 渲染原理
前端·ios
IT_陈寒5 分钟前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
云泽8087 分钟前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦9 分钟前
GO---可见性规则
开发语言·golang
逝水无殇22 分钟前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
iCOD3R43 分钟前
Skill - kill-ai-slop 解决“AI 味”样式
前端·css·ai编程
shuaijie05181 小时前
强制修改调用接口的api地址。
javascript·vue.js·ecmascript
JerrySir1 小时前
恶意 npm 包只活了 17 分钟:技术面试里,为什么“升级依赖”还不算止血?
javascript·安全
皮音1 小时前
Skill 在项目中的实践 —— 从 Agent 困境到 Skill 工程化
前端
白帽小阳1 小时前
2026前端面试题!(附答案及解析)
javascript·网络·python·安全·web安全·网络安全·护网行动