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
};
}
相关推荐
言乐613 分钟前
Python实现关税自动计算模型
开发语言·python·django·virtualenv·pygame
朝朝辞暮i13 分钟前
C++ 第 14 课:引用 &
开发语言·c++·算法
故七月19 分钟前
GEO 信源评估体系:如何判断一条网页信源能否被大模型采信
前端·网络·人工智能
liangshanbo121520 分钟前
Webpack 常见 Plugin 面试题
前端·webpack·node.js
xxwl58522 分钟前
vue3的入门学习
前端·vue.js·学习
用户8471721028423 分钟前
.shot 文件格式规范
前端·后端
web打印社区25 分钟前
政务办事大厅:叫号小票、办理回执网页怎么静默出纸
前端·javascript·vue.js·pdf·html·政务
梅雅达编程笔记41 分钟前
04-Python CSV数据保存与翻页抓取
开发语言·爬虫·python·pandas·数据采集·csv
C++ 老炮儿的技术栈1 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
估值探索者1 小时前
【Python量化策略实战 #04】Donchian 通道假突破太多?用 ATR 阈值过滤跑通真实突破信号
开发语言·python·接口·api接口·数据api接口·股票数据api接口