当前位置:博客首页>>javacript >> 阅读正文

hao123万年历中的农历显示源码

作者: 郑晓 分类: javacript 发布于: 2016-10-08 17:33 浏览:7,208 评论(13)


郑晓在朋友圈听说明年的中秋和国庆完全重叠了,突然感到非常的惊恐和不安,于是打开hao123万年历查了一下…
然后就像不知道1+1=2是什么原因一样,郑晓打开它的源码研究了起来。把它农历计算的部分都摘出来了,还写了调用方法,有需要的可以参考。它原程序中还有黄历的宜忌显示,数据都是写死的,一年一个文件感觉挺蛋疼就没弄。

!function() {
    function i(i) {
        var t = new Date(i);
        return - 0x94e9b950e00 > +t ? null: new e(t)
    }
    function e(i) {
        this.oDate = i,
        this.julianDay = A.fromDate(this.oDate),
        this.cnDay = this.oDate.getDay() ? f.digitCN[this.oDate.getDay()] : "日";
        for (var e, t = this.julianDay - A.JD2000,
        a = F.getTerms(t), h = s.getNewMoons(a), g = Math.round(t - h[0].JD), k = 0; k < h.length; k++) {
            if (e = h[k], g < e.days) {
                this.isBigMonth = 30 == e.days,
                this.isLeap = e.isLeap,
                this.lMonth = e.name,
                this.lNextMonth = e.nextName,
                this.lDate = f.dateCn[g],
                this.dateIndex = g;
                break
            }
            g -= e.days
        }
        t = Math.round(t),
        this.lYear = Math.floor((a[3].JD + (t < a[3].JD ? -365 : 0) + 5844 - 35) / 365.2422 + .5);
        var n = h[h.zyIndex].JD;
        n -= n > t ? 365 : 0,
        n += 5810,
        this.sYear = Math.floor(n / 365.2422 + .5),
        this.hYear = this.sYear + 1984 + 2698;
        var n = a.hash[t];
        this.term = n ? n.name: "";
        var n = this.lYear + 6e3;
        this.animal = f.chineseZodiac[n % 12],
        this.gzYear = f.heavenlyStems[n % 10] + f.earthlyBranches[n % 12];
        var n = Math.floor((t - a[0].JD) / 30.43685);
        12 > n && t >= a[2 * n + 1].JD && n++,
        n += 12 * Math.floor((a[12].JD + 390) / 365.2422) + 9e5,
        this.gzMonth = f.heavenlyStems[n % 10] + f.earthlyBranches[n % 12];
        var n = t - 6 + 9e6;
        this.gzDate = f.heavenlyStems[n % 10] + f.earthlyBranches[n % 12],
        this.gzChrono = f.earthlyBranches[Math.floor((this.oDate.getHours() + 1) / 2)] || "子"
    }
    function t(i) {
        var e = -.043126 + 628.301955 * i - 2732e-9 * i * i,
        t = .016708634 - 42037e-9 * i - 1.267e-7 * i * i;
        return - 20.49552 * (1 + t * Math.cos(e)) / D
    }
    function a() {
        return - 34e-7
    }
    function h(i) {
        var e, t, a = i * i,
        h = 0,
        g = j;
        for (e = 0; e < g.length; e += 5) t = 0 == e ? -1.742 * i: 0,
        h += (g[e + 3] + t) * Math.sin(g[e] + g[e + 1] * i + g[e + 2] * a);
        return h / 100 / D
    }
    function g(i) {
        return n(i / 365.2425 + 2e3) / 86400
    }
    function k(i, e) {
        var t = (i - 1820) / 100;
        return - 20 + e * t * t
    }
    function n(i) {
        var e = u[u.length - 2],
        t = u[u.length - 1];
        if (i >= e) {
            var a = 31;
            if (i > e + 100) return k(i, a);
            var h = k(i, a),
            g = k(e, a) - t;
            return h - g * (e + 100 - i) / 100
        }
        var n, r = u;
        for (n = 0; n < r.length && !(i < r[n + 5]); n += 5);
        var c = (i - r[n]) / (r[n + 5] - r[n]) * 10,
        o = c * c,
        f = o * c;
        return r[n + 1] + r[n + 2] * c + r[n + 3] * o + r[n + 4] * f
    }
    function r(i, e, t, a) {
        t /= 10;
        var h, g, k, n, r, c, o, f = 0,
        s = 1,
        F = l[i],
        A = 6 * e + 1,
        M = F[A + 1] - F[A];
        for (h = 0; 6 > h; h++, s *= t) if (n = F[A + h], r = F[A + 1 + h], o = r - n, o) {
            for (0 > a ? c = r: (c = Math.floor(3 * a * o / M + .5) + n, h && (c += 3), c > r && (c = r)), g = n, k = 0; c > g; g += 3) k += F[g] * Math.cos(F[g + 1] + t * F[g + 2]);
            f += k * s
        }
        if (f /= F[0], 0 == i) {
            var u = t * t,
            j = u * t;
            0 == e && (f += ( - .0728 - 2.7702 * t - 1.1019 * u - .0996 * j) / D),
            1 == e && (f += (0 + 4e-4 * t + 4e-4 * u - .0026 * j) / D),
            2 == e && (f += ( - .002 + .0044 * t + .0213 * u - .025 * j) / 1e6)
        } else {
            var E = d[3 * (i - 1) + e];
            0 == e && (f += -3 * t / D),
            f += 2 == e ? E / 1e6: E / D
        }
        return f
    }
    function c(i, e, t) {
        var a, h, g, k, n, r = M[i],
        c = 0,
        o = 1,
        f = e * e,
        s = f * e,
        F = s * e,
        A = F * e,
        d = e - 10;
        for (0 == i && (c += (3.81034409 + 8399.684730072 * e - 3319e-8 * f + 3.11e-8 * s - 2.033e-10 * F) * D, c += 5028.792262 * e + 1.1124406 * f + 7699e-8 * s - 23479e-9 * F - 1.78e-8 * A, d > 0 && (c += -.866 + 1.43 * d + .054 * d * d)), f /= 1e4, s /= 1e8, F /= 1e8, t *= 6, 0 > t && (t = r[0].length), a = 0; a < r.length; a++, o *= e) {
            for (g = r[a], k = Math.floor(t * g.length / r[0].length + .5), a && (k += 6), k >= g.length && (k = g.length), h = 0, n = 0; k > h; h += 6) n += g[h] * Math.cos(g[h + 1] + e * g[h + 2] + f * g[h + 3] + s * g[h + 4] + F * g[h + 5]);
            c += n * o
        }
        return 2 != i && (c /= D),
        c
    }
    function o(i) {
        var e = "0000000000",
        t = e + e,
        a = {
            J: "00",
            I: "000",
            H: "0000",
            G: "00000",
            t: "01",
            s: "001",
            r: "0001",
            q: "00001",
            p: "000001",
            o: "0000001",
            n: "00000001",
            m: "000000001",
            l: "0000000001",
            k: "03",
            j: "0303",
            i: "003",
            h: "003003",
            g: "0003",
            f: "00003",
            e: "000003",
            d: "0000003",
            c: "00000003",
            b: "000000003",
            a: "0000000003",
            A: t + t + t,
            B: t + t + e,
            C: t + t,
            D: t + e,
            E: t,
            F: e
        };
        return i.replace(/\D/g,
        function(i) {
            return a[i]
        })
    }
    var f = {
        digitCN: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"],
        heavenlyStems: ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"],
        earthlyBranches: ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"],
        chineseZodiac: ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"],
        term: ["冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪"],/*代码摘取自hao123万年历, 郑晓技术博客www.zh30.com*/
        monthCn: ["十一", "十二", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十"],
        dateCn: ["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一"]
    },
    s = {
        correction: o("EqoFscDcrFpmEsF1DfFideFelFpFfFfFiaipqti3ksttikptikqckstekqttgkqttgkqteksttikptikq1fjstgjqttjkqttgkqtekstfkptikq1tijstgjiFkirFsAeACoFsiDaDiADc3AFbBfgdfikijFifegF3FhaikgFag3E1btaieeibggiffdeigFfqDfaiBkF3kEaikhkigeidhhdiegcFfakF3ggkidbiaedksaFffckekidhhdhdikcikiakicjF3deedFhFccgicdekgiFbiaikcfi3kbFibefgEgFdcFkFeFkdcfkF3kfkcickEiFkDacFiEfbiaejcFfffkhkdgkaiei3ehigikhdFikfckF3dhhdikcfgjikhfjicjicgiehdikcikggcifgiejF3jkieFhegikggcikFegiegkfjebhigikggcikdgkaFkijcfkcikfkcifikiggkaeeigefkcdfcfkhkdgkegieidhijcFfakhfgeidieidiegikhfkfckfcjbdehdikggikgkfkicjicjF3dbidikFiggcifgiejkiegkigcdiegfggcikdbgfgefjF3kfegikggcikdgFkeeijcfkcikfkekcikdgkabhkFikaffcfkhkdgkegbiaekfkiakicjhfgqdq1fkiakgkfkhfkfcjiekgFebicggbedF3jikejbbbiakgbgkacgiejkijjgigfiakggfggcibFifjefjF3kfekdgjcibFeFkijcfkfhkfkeaieigekgbhkfikidfcjeaibgekgdkiffiffkiakF3jhbakgdki3dj3ikfkicjicjieeFkgdkicggkighdF3jfgkgfgbdkicggfggkidFkiekgijkeigfiskiggfaidheigF3jekijcikickiggkidhhdbgcfkFikikhkigeidieFikggikhkffaffijhidhhakgdkhkijF3kiakF3kfheakgdkifiggkigicjiejkieedikgdfcggkigieeiejfgkgkigbgikicggkiaideeijkefjeijikhkiggkiaidheigcikaikffikijgkiahi3hhdikgjfifaakekighie3hiaikggikhkffakicjhiahaikggikhkijF3kfejfeFhidikggiffiggkigicjiekgieeigikggiffiggkidheigkgfjkeigiegikifiggkidhedeijcfkFikikhkiggkidhh3ehigcikaffkhkiggkidhh3hhigikekfiFkFikcidhh3hitcikggikhkfkicjicghiediaikggikhkijbjfejfeFhaikggifikiggkigiejkikgkgieeigikggiffiggkigieeigekijcijikggifikiggkideedeijkefkfckikhkiggkidhh3ehijcikaffkhkiggkidhh3hhigikhkikFikfckcidhh3hiaikgjikhfjicjicgiehdikcikggifikigiejfejkieFhegikggifikiggfghigkfjeijkhigikggifikiggkigieeijcijcikfksikifikiggkidehdeijcfdckikhkiggkhghh3ehijikifffffkhsFngErD3pAfBoDd3BlEtFqA1AqoEpDqElAEsEeB1BmADlDkqBtC3FnEpDqnEmFsFsAFnllBbFmDsDiCtDmAB1BmtCgpEplCpAEiBiEoFqFtEqsDcCnFtADnFlEgdkEgmEtEsCtDmADqFtAFrAtEcCqAE3BoFqC3F3DrFtBmFtAC1ACnFaoCgADcADcCcFfoFtDlAFgmFqBq1bpEoAEmkqnEeCtAE3bAEqgDfFfCrgEcBrACfAAABqAAB3AAClEnFeCtCgAADqDoBmtAAACbFiAAADsEtBqAB1FsDqpFqEmFsCeDtFlCeDtoEpClEqAAFrAFoCgFmFsFqEnAEcCqFeCtFtEnAEeFtAAEkFnErAABbFkADnAAeCtFeAfBoAEpFtAABtFqAApDcCGJ"),
        calcForLow: function(i) {
            var e = 7771.37714500204,
            t = (i + 1.08472) / e;
            return t -= ( - 331e-7 * t * t + .10976 * Math.cos(.785 + 8328.6914 * t) + .02224 * Math.cos(.187 + 7214.0629 * t) - .03342 * Math.cos(4.669 + 628.3076 * t)) / e + (32 * (t + 1.8) * (t + 1.8) - 20) / 86400 / 36525,
            36525 * t + 8 / 24
        },
        calcForHigh: function(i) {
            var e = 36525 * E.MS_aLon_t2(i);
            e = e - g(e) + 8 / 24;
            var t = (e + .5) % 1 * 86400;
            return (1800 > t || t > 84600) && (e = 36525 * E.MS_aLon_t(i) - g(e) + 8 / 24),
            e
        },
        cache: {},
        getNewMoons: function(i) {
            var e = i[0].JD,
            t = s.calc(e),
            a = [];
            if (t > e && (t -= 29.53), s.cache[t]) a = s.cache[t];
            else {
                for (var h = 0; 15 > h; h++) a.push({
                    JD: s.calc(t + 29.5306 * h),
                    index: h
                }),
                h && (a[h - 1].days = a[h].JD - a[h - 1].JD);
                if (a[13].JD <= i[24].JD) {
                    for (h = 1; a[h + 1].JD > i[2 * h].JD && 13 > h; h++);
                    for (a[h].isLeap = !0; 14 > h; h++) a[h].index--
                }
                for (h = 0; 14 > h; h++) a[h].name = (a[h].isLeap ? "闰": "") + f.monthCn[a[h].index % 12],
                a[h].nextName = (a[h + 1].isLeap ? "闰": "") + f.monthCn[a[h + 1].index % 12],
                2 == a[h].index && (a.zyIndex = h);
                s.cache[t] = a
            }
            return a
        },
        calc: function(i) {
            i += A.JD2000;
            var e, t, a = 14,
            h = 1947168,
            g = 2436935;
            return i >= g ? Math.floor(this.calcForHigh(Math.floor((i + a - 2451551) / 29.5306) * Math.PI * 2) + .5) : i >= h && g > i ? (e = Math.floor(this.calcForLow(Math.floor((i + a - 2451551) / 29.5306) * Math.PI * 2) + .5), t = this.correction.substr(Math.floor((i - h) / 29.5306), 1) - 0, e + (t ? t - 2 : t)) : void 0
        }
    },
    F = {
        correction: o("FrcFs11AFsckF1tsDtFqEtF3posFdFgiFseFtmelpsEfhkF1anmelpFlF3ikrotcnEqEq1FfqmcDsrFor11FgFrcgDscFs11FgEeFtE1sfFs11sCoEsaF1tsD3FpeE1eFsssEciFsFnmelpFcFhkF1tcnEqEpFgkrotcnEqrEtFermcDsrE111FgBmcmr11DaEfnaF111sD3FpeForeF1tssEfiFpEoeFssD3iFstEqFppDgFstcnEqEpFg33FscnEqrAoAF1ClAEsDmDtCtBaDlAFbAEpAAAAAD1FgBiBqoBbnBaBoAAAAAAAEgDqAdBqAFrBaBoACdAAf3AACgAAAeBbCamDgEifAE1AABa3C3BgFdiAAACoCeE3ADiEifDaAEqAAFe3AcFbcAAAAAF3iFaAAACpACmFmAAAAAAAACrDaAAADG0"),
        calcForLow: function(i) {
            /*代码摘取自hao123万年历, 郑晓技术博客www.zh30.com*/"0": "") + i
    }
    var e = {
        "正月初一": "t,春节 ",
        "正月十五": "t,元宵节",
        "二月初二": "t,龙头节",
        "五月初五": "t,端午节",
        "七月初七": "t,乞巧节",
        "七月十五": "t,中元节",
        "八月十五": "t,中秋节",
        "九月初九": "t,重阳节",
        "十月初一": "t,寒衣节",
        "十月十五": "t,下元节",
        "腊月初八": "t,腊八节",
        "腊月廿三": "t,祭灶节",
        "0202": "i,世界湿地日,1996",
        "0308": "i,国际妇女节,1975",
        "0315": "i,国际消费者权益日,1983",
        "0422": "i,世界地球日,1990",
        "0501": "i,国际劳动节,1889",
        "0512": "i,国际护士节,1912",
        "0518": "i,国际博物馆日,1977",
        "0605": "i,世界环境日,1972",
        "0623": "i,国际奥林匹克日,1948",
        "0624": "i,世界骨质疏松日,1997",
        1117 : "i,世界学生日,1942",
        1201 : "i,世界艾滋病日,1988",
        "0101": "h,元旦",
        "0312": "h,植树节,1979",
        "0504": "h,五四青年节,1939",
        "0601": "h,儿童节,1950",
        "0701": "h,建党节,1941",
        "0801": "h,建军节,1933",
        "0910": "h,教师节,1985",
        1001 : "h,国庆节,1949",
        1224 : "c,平安夜",
        1225 : "c,圣诞节",
        "0214": "a,西洋情人节",
        w: {
            "0520": "i,母亲节,1913",
            "0630": "a,父亲节",
            1144 : "a,感恩节(美国)",
            1021 : "a,感恩节(加拿大)"
        }
    };
    Lunar.prototype.festival = function() {
        var t = this.oDate.getFullYear(),
        a = this.oDate.getMonth() + 1,
        h = this.oDate.getDate(),
        g = i(a) + i(h),
        k = this.oDate.getDay(),
        n = Math.ceil(h / 7),
        r = i(a) + n + k,
        c = this.lMonth,
        o = this.lDate,
        f = c + "月" + o,
        s = [];
        "正" == this.lNextMonth && o == (this.isBigMonth ? "三十": "廿九") && s.push("t,除夕"),
        e.w[r] && (s = s.concat(e.w[r].split("|"))),
        e[g] && (s = s.concat(e[g].split("|"))),
        e[f] && (s = s.concat(e[f].split("|")));
        for (var F, A = s.length - 1; A > -1; A--) F = s[A].split(","),
        F[2] && t < F[2] - 0 ? s.splice(A, 1) : s[A] = {
            type: F[0],
            desc: F[1]
        };
        return s.sort(function(i, e) {
            return e.type.charCodeAt(0) - i.type.charCodeAt(0)
        })
    }
}();

调用方法也很简单,以上代码运行后将e和i赋值给了window.Lunar和window.lunar。调用时使用lunar()方法即可,参数传入一个Date对象。

//调用
var l = lunar(new Date(1475280000000)); //2016.10.10 8:00:00 毫秒
//其中有如下属性
console.log(l.animal);      //生肖,如"猴"
console.log(l.cnDay);       //星期几(中文),如"六"
console.log(l.dateIndex);   //当天在本月中的索引(第1天是0),如"0"
console.log(l.gzChrono);    //当前时辰,如"辰"
console.log(l.gzMonth);     //日的干支表示,如"丁酉"
console.log(l.gzYear);      //月的干支表示,如"丙申"
console.log(l.hYear);       //当年年份+2698 没具体看过程不清楚作用,如"4714"
console.log(l.isBigMonth);  //是否是大月份(30),如"true"
console.log(l.julianDay);   //儒略日,如"2457662.8333333335"
console.log(l.isLeap);      //是否是闰月,如"true",这里的示例非闫月,是undefined
console.log(l.lDate);       //农历日,如"初一"
console.log(l.lMonth);      //农历月,如"九"
console.log(l.lNextMonth);  //农历下月,如"十"
console.log(l.lYear);       //生肖轮循 1984年至今的年数,如"32"
console.log(l.sYear);       //同上,如"32"
console.log(l.term);        //节气,如"霜降",这里的示例没有,为空
console.log(l.oDate);       //当前的Date对象
console.log(l.festival()[0].desc);  //当天的节日信息(如果有),如"国庆节"
       

本文采用知识共享署名-非商业性使用 3.0 中国大陆许可协议进行许可,转载时请注明出处及相应链接。

本文永久链接: https://www.zh30.com/hao123-calendar-js.html

hao123万年历中的农历显示源码:目前有13 条留言

用户评论头像 男儿当志强发表于 2017年04月05日 16:26[回复]

亲,如何在hao123的万年历页面,找到lunar.js ? 我找了好久也没找到这个程序。。。是F12看资源吧?辛苦了我是真没找到。。。

    用户评论头像 郑晓发表于 2017年04月05日 17:39[回复]

    没有这个lunar.js。

      用户评论头像 男儿当志强发表于 2017年04月07日 13:37[回复]

      确实没有。。。我用的fullcalendar写个日历,最新版本的,网上找的代码实现的基本都是之前老版本的。hao123现在也是用的365日历的东西,抓完了。。。表示比较看不懂。。。再读读代码吧,明显是代码阅读理解能力比较弱

用户评论头像 春熙路博客发表于 2016年12月21日 19:10[回复]

这个屌

用户评论头像 QQ-93445091发表于 2016年10月25日 09:15[回复]

学习带来乐趣,谢谢博主!

用户评论头像 kuyus发表于 2016年10月20日 16:13[回复]

路过~混个脸熟。

用户评论头像 xx发表于 2016年10月18日 18:17[回复]

很厉害!!

    用户评论头像 xx发表于 2016年10月18日 18:19[回复]

    alert(‘我试试’);

用户评论头像 蒂欧娜发表于 2016年10月17日 16:35[回复]

来看看,学习学习!!

用户评论头像 友好的菠菜发表于 2016年10月16日 23:38[回复]

网站看起来特别舒服!

用户评论头像 感情线发表于 2016年10月13日 15:15[回复]

很喜欢你网站的排版,让人感觉舒服。

用户评论头像 三五营销发表于 2016年10月09日 13:50[回复]

向您学习,我的QQ:905859933!多多指教!
丙申年(猴)九月初八 2016-10-8

    用户评论头像 郑晓发表于 2016年10月13日 09:36[回复]

    你的留言被系统过滤掉了…

发表评论

change vcode