FullCalendar用来做日程管理功能非常强大,但是唯一不足的地方是没有将中国农历历法加进去,今天我将结合实例和大家分享如何将中国农历中的节气和节日整合到FullCalendar中,从而增强其实用性。

HTML

首先是要载入jQuery库和fullcalendar插件。

<script src='js/jquery-1.9.1.min.js'></script> 
<script src='js/fullcalendar.min.js'></script> 

然后在body中,建立日历容器div#calendar。

<div id="calendar"></div> 

jQuery

使用jQuery调用fullcalendar插件,方法如下,值得一提的是events数据源来自json.php,这个PHP文件负责读取数据并返回json格式的日程安排数据给前端。

$(function() { 
    $('#calendar').fullCalendar({ 
        header: { 
            left: 'prev,next today', 
            center: 'title', 
            right: 'month,agendaWeek,agendaDay' 
        }, 
        selectable: true, 
        events: 'json.php' //数据源 
    }); 
}); 

以上代码就可以展示一个日历界面,但是需要加入农历,则需要将农历算法代码整合到fullCalendar中,并且需要将fullCalendar.js中的代码稍微改动下,以下是网友@太空飛豬以及/可爱/玫瑰提供的中国农历算法javascript版,再此一并感谢!

function RunGLNL() { 
    var today = new Date(); 
    var d = new Array("周日", "周一", "周二", "周三", "周四", "周五", "周六"); 
    var DDDD = d[today.getDay()]; 
    DDDD = DDDD + " " + (CnDateofDateStr(today)); //显示农历 
    DDDD = DDDD + SolarTerm(today); //显示二十四节气 
    document.write(DDDD); 

function DaysNumberofDate(DateGL) { 
    return parseInt((Date.parse(DateGL) - Date.parse(DateGL.getFullYear() + "/1/1")) / 86400000) + 1; 

function CnDateofDate(DateGL) { 
    var CnData = new Array( 
        0x16, 0x2a, 0xda, 0x00, 0x83, 0x49, 0xb6, 0x05, 0x0e, 0x64, 0xbb, 0x00, 0x19, 0xb2, 0x5b, 0x00, 
        0x87, 0x6a, 0x57, 0x04, 0x12, 0x75, 0x2b, 0x00, 0x1d, 0xb6, 0x95, 0x00, 0x8a, 0xad, 0x55, 0x02, 
        0x15, 0x55, 0xaa, 0x00, 0x82, 0x55, 0x6c, 0x07, 0x0d, 0xc9, 0x76, 0x00, 0x17, 0x64, 0xb7, 0x00, 
        0x86, 0xe4, 0xae, 0x05, 0x11, 0xea, 0x56, 0x00, 0x1b, 0x6d, 0x2a, 0x00, 0x88, 0x5a, 0xaa, 0x04, 
        0x14, 0xad, 0x55, 0x00, 0x81, 0xaa, 0xd5, 0x09, 0x0b, 0x52, 0xea, 0x00, 0x16, 0xa9, 0x6d, 0x00, 
        0x84, 0xa9, 0x5d, 0x06, 0x0f, 0xd4, 0xae, 0x00, 0x1a, 0xea, 0x4d, 0x00, 0x87, 0xba, 0x55, 0x04 
    ); 
    var CnMonth = new Array(); 
    var CnMonthDays = new Array(); 
    var CnBeginDay; 
    var LeapMonth; 
    var Bytes = new Array(); 
    var I; 
    var CnMonthData; 
    var DaysCount; 
    var CnDaysCount; 
    var ResultMonth; 
    var ResultDay; 
    var yyyy = DateGL.getFullYear(); 
    var mm = DateGL.getMonth() + 1; 
    var dd = DateGL.getDate(); 
    if (yyyy < 100) yyyy += 1900; 
    if ((yyyy < 1997) || (yyyy > 2020)) { 
        return 0; 
    } 
    Bytes[0] = CnData[(yyyy - 1997) * 4]; 
    Bytes[1] = CnData[(yyyy - 1997) * 4 + 1]; 
    Bytes[2] = CnData[(yyyy - 1997) * 4 + 2]; 
    Bytes[3] = CnData[(yyyy - 1997) * 4 + 3]; 
    if ((Bytes[0] & 0x80) != 0) { 
        CnMonth[0] = 12; 
    } 
    else { 
        CnMonth[0] = 11; 
    } 
    CnBeginDay = (Bytes[0] & 0x7f); 
    CnMonthData = Bytes[1]; 
    CnMonthData = CnMonthData << 8; 
    CnMonthData = CnMonthData | Bytes[2]; 
    LeapMonth = Bytes[3]; 
    for (I = 15; I >= 0; I--) { 
        CnMonthDays[15 - I] = 29; 
        if (((1 << I) & CnMonthData) != 0) { 
            CnMonthDays[15 - I]++; 
        } 
        if (CnMonth[15 - I] == LeapMonth) { 
            CnMonth[15 - I + 1] = -LeapMonth; 
        } 
        else { 
            if (CnMonth[15 - I] < 0) { 
                CnMonth[15 - I + 1] = -CnMonth[15 - I] + 1; 
            } 
            else { 
                CnMonth[15 - I + 1] = CnMonth[15 - I] + 1; 
            } 
            if (CnMonth[15 - I + 1] > 12) { 
                CnMonth[15 - I + 1] = 1; 
            } 
        } 
    } 
    DaysCount = DaysNumberofDate(DateGL) - 1; 
    if (DaysCount <= (CnMonthDays[0] - CnBeginDay)) { 
        if ((yyyy > 1901) && (CnDateofDate(new Date((yyyy - 1) + "/12/31")) < 0)) { 
            ResultMonth = -CnMonth[0]; 
        } 
        else { 
            ResultMonth = CnMonth[0]; 
        } 
        ResultDay = CnBeginDay + DaysCount; 
    } 
    else { 
        CnDaysCount = CnMonthDays[0] - CnBeginDay; 
        I = 1; 
        while ((CnDaysCount < DaysCount) && (CnDaysCount + CnMonthDays[I] < DaysCount)) { 
            CnDaysCount += CnMonthDays[I]; 
            I++; 
        } 
        ResultMonth = CnMonth[I]; 
        ResultDay = DaysCount - CnDaysCount; 
    } 
    if (ResultMonth > 0) { 
        return ResultMonth * 100 + ResultDay; 
    } 
    else { 
        return ResultMonth * 100 - ResultDay; 
    } 

function CnYearofDate(DateGL) { 
    var YYYY = DateGL.getFullYear(); 
    var MM = DateGL.getMonth() + 1; 
    var CnMM = parseInt(Math.abs(CnDateofDate(DateGL)) / 100); 
    if (YYYY < 100) YYYY += 1900; 
    if (CnMM > MM) YYYY--; 
    YYYY -= 1864; 
    return CnEra(YYYY) + "年"; 

function CnMonthofDate(DateGL) { 
    var CnMonthStr = new Array("零", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊"); 
    var Month; 
    Month = parseInt(CnDateofDate(DateGL) / 100); 
    if (Month < 0) { 
        return "闰" + CnMonthStr[-Month] + "月"; 
    } 
    else { 
        return CnMonthStr[Month] + "月"; 
    } 

function CnDayofDate(DateGL) { 
    var CnDayStr = new Array("零", 
        "初一", "初二", "初三", "初四", "初五", 
        "初六", "初七", "初八", "初九", "初十", 
        "十一", "十二", "十三", "十四", "十五", 
        "十六", "十七", "十八", "十九", "二十", 
        "廿一", "廿二", "廿三", "廿四", "廿五", 
        "廿六", "廿七", "廿八", "廿九", "三十"); 
    var Day; 
    Day = (Math.abs(CnDateofDate(DateGL))) % 100; 
    //hanlichen mod 
    if ("初一" == CnDayStr[Day]) { 
        // alert(SolarTerm(DateGL)); 
        return CnMonthofDate(DateGL); 
    } else { 
        if (SolarTerm(DateGL) != "") { 
            return SolarTerm(DateGL); 
        } else { 
            return CnDayStr[Day]; 
        } 
    } 

function DaysNumberofMonth(DateGL) { 
    var MM1 = DateGL.getFullYear(); 
    MM1 < 100 ? MM1 += 1900 : MM1; 
    var MM2 = MM1; 
    MM1 += "/" + (DateGL.getMonth() + 1); 
    MM2 += "/" + (DateGL.getMonth() + 2); 
    MM1 += "/1"; 
    MM2 += "/1"; 
    return parseInt((Date.parse(MM2) - Date.parse(MM1)) / 86400000); 

function CnEra(YYYY) { 
    var Tiangan = new Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"); 
    var Dizhi = new Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"); 
    return Tiangan[YYYY % 10] + Dizhi[YYYY % 12]; 

function CnDateofDateStr(DateGL) { 
    if (CnMonthofDate(DateGL) == "零月") return " 请调整您的计算机日期!"; 
    else return "农历" + CnYearofDate(DateGL) + " " + CnMonthofDate(DateGL) + CnDayofDate(DateGL); 

 
function SolarTerm(DateGL) { 
    var SolarTermStr = new Array( 
        "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", 
        "清明", "谷雨", "立夏", "小满", "芒种", "夏至", 
        "小暑", "大暑", "立秋", "处暑", "白露", "秋分", 
        "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"); 
    var DifferenceInMonth = new Array( 
        1272060, 1275495, 1281180, 1289445, 1299225, 1310355, 
        1321560, 1333035, 1342770, 1350855, 1356420, 1359045, 
        1358580, 1355055, 1348695, 1340040, 1329630, 1318455, 
        1306935, 1297380, 1286865, 1277730, 1274550, 1271556); 
    var DifferenceInYear = 31556926; 
    var BeginTime = new Date(1901 / 1 / 1); 
    BeginTime.setTime(947120460000); 
    for (; DateGL.getFullYear() < BeginTime.getFullYear();) { 
        BeginTime.setTime(BeginTime.getTime() - DifferenceInYear * 1000); 
    } 
    for (; DateGL.getFullYear() > BeginTime.getFullYear();) { 
        BeginTime.setTime(BeginTime.getTime() + DifferenceInYear * 1000); 
    } 
    for (var M = 0; DateGL.getMonth() > BeginTime.getMonth(); M++) { 
        BeginTime.setTime(BeginTime.getTime() + DifferenceInMonth[M] * 1000); 
    } 
    if (DateGL.getDate() > BeginTime.getDate()) { 
        BeginTime.setTime(BeginTime.getTime() + DifferenceInMonth[M] * 1000); 
        M++; 
    } 
    if (DateGL.getDate() > BeginTime.getDate()) { 
        BeginTime.setTime(BeginTime.getTime() + DifferenceInMonth[M] * 1000); 
        M == 23 ? M = 0 : M++; 
    } 
    var JQ = ""; 
    if (DateGL.getDate() == BeginTime.getDate()) { 
        JQ += SolarTermStr[M]; 
    } 
    return JQ; 

将以上代码直接复制粘贴到从官网下载的fullcalendar.js的最后。然后关键的是我们要对fullcalendar.js原有的代码中程序日历天数的代码段做修改。

大概在第2385行开始,其中的if语句中的部分修改为以下代码

if (showNumbers) {//月视图天数数字显示 
    var cnMonth = CnMonthofDate(date);//农历月 
    var cnDay = CnDayofDate(date);//农历日 
    var solar = SolarTerm(date);//农历节气 
    if(solar!='') cnDay=solar; 
    var cnMonDay = cnMonth+cnDay; 
 
    var holiday = ''; 
    if(cnDay=='正月') 
        holiday = '春节'; 
    switch(cnMonDay){ 
        case '正月初一': holiday = '春节';break; 
        case '正月十五': holiday = '元宵';break; 
        case '五月初五': holiday = '端午';break; 
        case '八月十五': holiday = '中秋';break; 
        case '九月初九': holiday = '重阳';break; 
        case '腊月三十': holiday = '除夕';break; 
    } 
             
    html += "<div class='fc-day-number'><span class='solarday'>"+ cnDay+"</span> 
    <span class='holiday'>"+holiday+"</span>" + date.getDate() + "</div>"; 

以上代码中,调用了农历算法,计算出日历中对应的农历日期包括节气,在这里我们还做了特殊节日的处理,比如春节、端午、中秋等,然后我们要将农历与公历以及特殊节日同时显示在fullcalendar中,这时就要修改css来控制使得公历日期显示在左上,农历显示在右上,特殊节日显示在中间。

.fc-grid .fc-day-number{padding: 0 2px; position:relative} 
.fc-grid .fc-day-number span.solarday{float:right;color:#999}     
.fc-grid .fc-day-number span.holiday{position:absolute; left:40%} 

FullCalendar应用——整合农历节气和节日的更多相关文章

  1. C#实现万年历(农历、节气、节日、星座、属相、生肖、闰年等)

    C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰等,代码如下: using System.Collections.Generic; using System.Text; using ...

  2. C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)

    C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰地址:http://www.cnblogs.com/txw1958/archive/2013/01/27/csharp-calend ...

  3. python3实现万年历(包括公历、农历、节气、节日)

    #!/usr/local/bin/python3 # coding=utf-8 # Created: 20/07/2012 # Copyright: http://www.cnblogs.com/tx ...

  4. 《JQuery常用插件教程》系列分享专栏

    <JQuery常用插件教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201719.html 文章 使用jquery插件实现图 ...

  5. 转--2014年最新810多套android源码2.46GB免费一次性打包下载

    转载自:http://www.eoeandroid.com/thread-497046-1-1.html 感谢该博客主人无私奉献~~ 下面的源码是从今年3月份开始不断整理源码区和其他网站上的安卓例子源 ...

  6. 2014年最新720多套Android源码2.0GB免费一次性打包下载

    之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年3月份开始不断整理源码区和其他网站上的android源码,目前总共有720套左右,根据实现的功能被我分成了100多个类,总共 ...

  7. ym——android源代码大放送(实战开发必备)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 目录 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.c ...

  8. php获取农历、节日、节气

    /* * 农历 节气 节日 * edit: www.jbxue.com */ header("Content-Type:text/html;charset=utf-8"); cla ...

  9. C# 中国日历 农历 阳历 星座 二十四节气 二十八星宿 节日 天干地支

    using System; namespace DotNet.Utilities { /// <summary> /// 农历属性 /// </summary> public ...

随机推荐

  1. 关于几个主流语音SDK的接入问题

    这两周都在忙着游戏上线还有接入游戏语音,两周分别接了腾讯语音和百度语音!!! 关于腾讯语音的一些问题 由于发现腾讯语音的在录完音频后的数据是编过码的所以出现了一些问题: *不能解码(腾讯方不提供解码算 ...

  2. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  3. setTimeout 的黑魔法

    setTimeout,前端工程师必定会打交道的一个函数.它看上去非常的简单,朴实.有着一个很不平凡的名字--定时器.让年少的我天真的以为自己可以操纵未来.却不知朴实之中隐含着惊天大密.我还记得我第一次 ...

  4. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  5. C语言 · Torry的困惑(基本型)

    问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题告诉老师 ...

  6. solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...

  7. WinForm 天猫2013双11自动抢红包【源码下载】

    1. 正确获取红包流程 2. 软件介绍 2.1 效果图: 2.2 功能介绍 2.2.1 账号登录 页面开始时,会载入这个网站:https://login.taobao.com/member/login ...

  8. Solr高级查询Facet

    一.什么是facet solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索. facet主要用于导航实现渐进式精确搜索 ...

  9. Angularjs参考框架地址

    1.Table(Grid)参考地址 https://github.com/samu/angular-table https://github.com/daniel-nagy/md-data-table ...

  10. 神技!微信小程序(应用号)抢先入门教程(附最新案例DEMO-豆瓣电影)持续更新

    微信小程序 Demo(豆瓣电影) 由于时间的关系,没有办法写一个完整的说明,后续配合一些视频资料,请持续关注 官方文档:https://mp.weixin.qq.com/debug/wxadoc/de ...