`
天梯梦
  • 浏览: 13705235 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

FullCalendar 七:FullCalendar应用——整合农历节气和节日

 
阅读更多

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

如果您还不了解日程安排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格式的日程安排数据给前端,具体请看本站文章:FullCalendar应用——读取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与农历的整合,请点击这里查看演示

 

来源于helloweba.comFullCalendar应用——整合农历节气和节日

分享到:
评论
2 楼 天梯梦 2016-03-09  
mw8231980 写道
很棒的教程,给予我很大帮助,感谢


有帮助就好!
1 楼 mw8231980 2016-01-07  
很棒的教程,给予我很大帮助,感谢

相关推荐

    fullcalendar-5.9.0最新版本增加农历,节气,节日

    - **节日集成**:除了农历和节气外,FullCalendar现在还可以展示特定的节日,如春节、中秋节等,这使得日历更具有文化特色,方便用户安排庆祝活动。 2. **使用方法** - **locales.html**:描述中提到的`locales....

    fullcalendar-2.7.3带中国节日节气

    全历插件FullCalendar是一款广泛应用于网页端的事件日历组件,版本2.7.3在原有的功能基础上,特别针对中国市场进行了优化,加入了中国的节日和节气,使得它更加适用于中国的用户群体。以下是对FullCalendar及其2.7.3...

    fullcalendar支持农历 年历

    标题提及的"fullcalendar支持农历 年历"意味着它不仅限于公历日期显示,还能够处理中国的农历日期,进一步扩展了其在东亚文化背景下的应用。 FullCalendar的核心特性包括: 1. **多视图展示**:FullCalendar支持...

    fullcalendar改造后插件

    在中国和其他东亚国家,农历在日常生活和节日中扮演着重要角色。为了在FullCalendar中集成农历,我们需要找到一个可靠的农历转换库,例如`ChineseLunar`或`lunardate`,它们可以将公历日期转换为农历日期。将这个库...

    FullCalendar_农历_汉化_最新版_1.6.4_日历控件

    这个"FullCalendar_农历_汉化_最新版_1.6.4_日历控件"提供了对农历和中国节气的支持,使得这款日历控件更适合中国的用户群体。1.6.4是其更新到的最新版本,意味着它可能包含了一些优化和新特性,以提升用户体验和...

    FullCalendar_农历_汉化_源码_jquery_google

    类拟outlook、google的日历控件,增加了中国农历+节气显示,需要的话,可以下载,位置在:fullcalendar-1.5.4\demos\theme_mcy_chinese_demo.html

    jQuery日程管理插件fullcalendar使用详解

    全篇文章的核心在于介绍如何将中国农历节气和节日整合到fullCalendar插件中。这是因为在fullCalendar的原有功能中并没有包含农历历法,因此作者分享了如何将农历算法代码整合进fullCalendar,以及如何进行必要的代码...

    日历代码大全

    例如,你需要知道如何计算闰年、每个月的天数,以及中国农历的节气和节日。 3. **事件管理**:日历应用的核心是事件管理,包括添加、编辑、删除事件,设置提醒和重复规则。这涉及到数据结构设计,如使用SQLite...

    带农历的日历(可任意放)

    这种日历通常对那些关注中国传统节气和农历日期的用户非常有用,比如农民、中医从业者或者对农历有特别需求的群体。 描述中的“.html”表明这个日历可能是一个基于HTML的网页应用。HTML(超文本标记语言)是用于...

    带节假日、农历的JSP/JS日历

    农历日历不仅包括月份和日期,还可能需要显示节气和中国传统节日。 在实际开发中,JSP和JS之间的通信通常通过AJAX(异步JavaScript和XML)实现。当用户在日历上进行操作(如选择日期或切换月份)时,JS可以发送AJAX...

    日历以及时间轴

    在中国,农历与节气的显示尤为重要,因为它符合中国人的日常生活习惯。在设计一个日历时,需要考虑到这些不同的历法,并能够根据用户的设置进行切换。同时,日历应能准确地显示每个月的天数,比如2月份可能有28天或...

Global site tag (gtag.js) - Google Analytics