You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript/jQuery或PHP从.ics链接提取课程日程到校园网站

实现ICS课程日程提取与展示的简易方案

嘿,针对你搭建校园网站展示ICS日程的需求,我整理了两种实用的方案,不管你想前端直接处理还是后端解析后再展示都有办法:

前端 JavaScript/jQuery 方案

如果不想折腾后端,直接在前端处理是最快捷的路径。这里推荐用轻量级的ical.js库,它专门用来解析ICS格式,不用额外依赖,上手很简单:

  1. 引入ical.js
    直接用CDN引入即可,省得下载文件:

    <script src="https://cdn.jsdelivr.net/npm/ical.js@1.5.0/build/ical.min.js"></script>
    
  2. 获取并渲染日程
    用jQuery或者原生JS请求你的ICS链接,解析后把事件渲染到页面上。下面是jQuery的示例:

    // 假设页面上有个id为event-container的容器用来放课程
    const $eventContainer = $('#event-container');
    
    $.get('你的ICS文件地址.ics', function(icsData) {
      // 解析ICS数据
      const jcalData = ical.parse(icsData);
      const calendar = new ical.Component(jcalData);
      // 提取所有事件
      const events = calendar.getAllSubcomponents('vevent');
    
      // 遍历事件,生成HTML插入页面
      events.forEach(event => {
        const eventObj = new ical.Event(event);
        const eventHtml = `
          <div class="course-item">
            <h4>${eventObj.summary}</h4>
            <p>📅 时间:${new Date(eventObj.startDate).toLocaleString()}</p>
            <p>📍 地点:${eventObj.location || '未指定'}</p>
            ${eventObj.description ? `<p>📝 描述:${eventObj.description}</p>` : ''}
          </div>
        `;
        $eventContainer.append(eventHtml);
      });
    }).fail(function(error) {
      console.log('加载日程失败:', error);
      $eventContainer.html('<p>暂时无法加载课程日程,请稍后再试</p>');
    });
    

    要是你不用jQuery,用原生fetch也能实现,逻辑是一样的:

    const eventContainer = document.getElementById('event-container');
    
    fetch('你的ICS文件地址.ics')
      .then(res => res.text())
      .then(icsData => {
        const jcalData = ical.parse(icsData);
        const calendar = new ical.Component(jcalData);
        const events = calendar.getAllSubcomponents('vevent');
    
        events.forEach(event => {
          const eventObj = new ical.Event(event);
          const courseDiv = document.createElement('div');
          courseDiv.className = 'course-item';
          courseDiv.innerHTML = `
            <h4>${eventObj.summary}</h4>
            <p>📅 时间:${new Date(eventObj.startDate).toLocaleString()}</p>
            <p>📍 地点:${eventObj.location || '未指定'}</p>
            ${eventObj.description ? `<p>📝 描述:${eventObj.description}</p>` : ''}
          `;
          eventContainer.appendChild(courseDiv);
        });
      })
      .catch(error => {
        console.log('加载日程失败:', error);
        eventContainer.innerHTML = '<p>暂时无法加载课程日程,请稍后再试</p>';
      });
    

    ⚠️ 注意:如果你的ICS链接和网站不在同一个域名下,会遇到CORS跨域限制。这时候要么让ICS服务端配置允许跨域,要么用后端代理(就是下面的PHP方案)。

后端PHP方案

如果遇到跨域问题,或者想提前对日程数据做处理(比如过滤过期课程),用PHP解析ICS再返回给前端会更稳妥。推荐用johngrogg/ics-parser这个专门的解析库:

  1. 安装解析库
    用Composer安装(如果没装Composer,先去官网装一下,很简单):

    composer require johngrogg/ics-parser
    
  2. 编写PHP接口
    创建一个fetch-course-events.php文件,用来获取并解析ICS数据,返回JSON格式的事件列表:

    <?php
    require 'vendor/autoload.php';
    
    use ICal\ICal;
    
    // 替换成你的ICS链接
    $icsUrl = '你的ICS文件地址.ics';
    
    try {
      $ical = new ICal([
        'url' => $icsUrl,
        'defaultTimeZone' => 'Asia/Shanghai', // 根据你的时区调整,比如Asia/Beijing
      ]);
    
      // 获取未来30天的课程事件(也可以用$ical->events获取全部)
      $events = $ical->eventsFromInterval('30 days');
    
      // 返回JSON数据给前端
      header('Content-Type: application/json');
      echo json_encode($events);
    } catch (\Exception $e) {
      header('HTTP/1.1 500 Internal Server Error');
      echo json_encode(['error' => '加载课程日程失败:' . $e->getMessage()]);
    }
    
  3. 前端调用接口
    然后前端用jQuery或者原生JS请求这个PHP接口,渲染数据:

    const $eventContainer = $('#event-container');
    
    $.get('fetch-course-events.php', function(events) {
      if (events.error) {
        $eventContainer.html(`<p>${events.error}</p>`);
        return;
      }
    
      events.forEach(event => {
        const eventHtml = `
          <div class="course-item">
            <h4>${event.summary}</h4>
            <p>📅 时间:${new Date(event.start).toLocaleString()}</p>
            <p>📍 地点:${event.location || '未指定'}</p>
            ${event.description ? `<p>📝 描述:${event.description}</p>` : ''}
          </div>
        `;
        $eventContainer.append(eventHtml);
      });
    }).fail(function() {
      $eventContainer.html('<p>暂时无法加载课程日程,请稍后再试</p>');
    });
    

额外小建议

  • 时区设置:不管用哪种方案,一定要设置正确的时区,不然课程时间会显示错误。
  • 样式美化:给.course-item写点CSS样式,比如加个边框、 padding,让课程列表看起来更整洁,符合校园网站的风格。
  • 事件过滤:可以根据需要过滤掉已经结束的课程,只展示未来的,提升用户体验。

内容的提问来源于stack exchange,提问作者Fredrik Burmester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:11