分類
標籤
.env AI Arc Arm Astro BigQuery btop Certbot Chrome CICD Cookie CORS CSS cURL DataTables defineExpose DevOps Docker Draggable Fetch API Gamania Git GitLab Google Calendar Google Cloud Summit Google Tag Manager GSAP HTML iCal inject JavaScript Laravel Less LINE Llama 3 Masonry Meta Nginx Nginx UI O(log n) Ollama OpenSSL Oracle OrbStack PHP Pinia Pixel Postman provide Proxyman Raycast requestAnimationFrame script setup Server Session Sitemap Socialite SSL TablePlus Termius Valet Vertex AI Visual Studio Code Vite Vue 3 Vue2 Vue3 Vuex Warp Webpack Yahoo Calendar Zeabur 二分搜尋 元件溝通 前端開發 動畫效果 峰值體驗 廣告 性能優化 打包 推薦系統 搜尋 時間複雜度 演算法 瀑布流排版 父子元件 環境變數 程式碼複製按鈕 系統監控 網站地圖 網頁開發 自動化部署 螢幕刷新率 語言模型 資訊檢索 跨域請求 轉化率 開發工具 陣列 電商 電子商務
743 字
4 分鐘
JavaScript 日曆事件處理:輕鬆生成 iCal、Google 及 Yahoo 日曆連結
身為開發者,我們常常需要處理日曆事件,特別是當網站或應用程式需要讓使用者將事件新增到他們的個人日曆時。這篇文章將介紹如何使用 JavaScript 來建立一個 Calendar 類別,讓您輕鬆生成 iCal 格式的事件資料,以及 Google Calendar 和 Yahoo Calendar 的連結。
為什麼需要自訂日曆事件處理?
雖然現代瀏覽器大多支援 iCal 格式,但直接提供 .ics 檔案下載可能會影響使用者體驗。透過生成 iCal 格式的連結,使用者可以直接在瀏覽器中開啟事件,並選擇要新增到哪個日曆服務。
程式碼
在下面的程式碼中,包括時間處理和程式碼的結構:
import moment from "moment";
/**
* 產生日曆事件連結的工具類別
*/
export class Calendar {
/**
* @param {Object} event - 事件資訊
* @param {String} event.DTSTART - 開始時間 (格式:YYYYMMDDTHHMMSSZ)
* @param {String} event.DTEND - 結束時間 (格式:YYYYMMDDTHHMMSSZ)
* @param {String} event.SUMMARY - 標題
* @param {String} event.DESCRIPTION - 描述
* @param {String} event.TZID - 時區 (例如:Asia/Taipei)
*/
constructor(event) {
this.event = {
...event,
DTSTART: this.formatTime(event.DTSTART),
DTEND: this.formatTime(event.DTEND)
};
}
/**
* 轉換時間格式
* @param {String} time - 原始時間
* @returns {String} - 轉換後的時間
*/
formatTime(time) {
return moment(time).utc().format("YYYYMMDDTHHmmss") + "Z";
}
/**
* 產生 iCal 格式的文字
* @returns {String} - iCal 格式的文字
*/
generateICS() {
const { DTSTART, DTEND, SUMMARY, DESCRIPTION, TZID } = this.event;
const icsMSG = `BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
DTSTART;VALUE=DATE;TZID=${TZID}:${DTSTART}
DTEND;VALUE=DATE;TZID=${TZID}:${DTEND}
SUMMARY:${SUMMARY}
DESCRIPTION:${DESCRIPTION}
END:VEVENT
END:VCALENDAR`;
return "data:text/calendar;charset=utf-8," + encodeURIComponent(icsMSG);
}
/**
* 產生 Google Calendar 的連結
* @returns {String} - Google Calendar 的連結
*/
generateGoogleCalendarURL() {
const { DTSTART, DTEND, SUMMARY, DESCRIPTION, TZID } = this.event;
return `https://calendar.google.com/calendar/u/0/r/eventedit?dates=${DTSTART}/${DTEND}&text=${encodeURIComponent(SUMMARY)}&details=${encodeURIComponent(DESCRIPTION)}&ctz=${encodeURIComponent(TZID)}`;
}
/**
* 產生 Yahoo Calendar 的連結
* @returns {String} - Yahoo Calendar 的連結
*/
generateYahooCalendarURL() {
const { DTSTART, DTEND, SUMMARY, DESCRIPTION, TZID } = this.event;
return `https://calendar.yahoo.com/?v=60&TYPE=20&VIEW=d&ST=${DTSTART}&ET=${DTEND}&TITLE=${encodeURIComponent(SUMMARY)}&desc=${encodeURIComponent(DESCRIPTION)}&vtz=${encodeURIComponent(TZID)}`;
}
}
如何使用 Calendar 類別
// 引入 Calendar 類別
import { Calendar } from './path-to-calendar';
// 定義事件資訊
const event = {
DTSTART: '20240617T120000Z', // 開始時間 (格式:YYYYMMDDTHHMMSSZ)
DTEND: '20240617T130000Z', // 結束時間 (格式:YYYYMMDDTHHMMSSZ)
SUMMARY: '會議', // 標題
DESCRIPTION: '團隊會議', // 描述
TZID: 'Asia/Taipei' // 時區
};
// 建立 Calendar 實例
const calendar = new Calendar(event);
// 生成 iCal 連結
const icalLink = calendar.generateICS();
console.log('iCal 連結:', icalLink);
// 生成 Google Calendar 連結
const googleCalendarLink = calendar.generateGoogleCalendarURL();
console.log('Google Calendar 連結:', googleCalendarLink);
// 生成 Yahoo Calendar 連結
const yahooCalendarLink = calendar.generateYahooCalendarURL();
console.log('Yahoo Calendar 連結:', yahooCalendarLink);
現在,就有了三個連結:
- icsLink:可以直接在瀏覽器中開啟 iCal 事件。
- googleCalendarLink:在 Google Calendar 中新增事件。
- yahooCalendarLink:在 Yahoo Calendar 中新增事件。
結論
透過這個 Calendar 類別,可以更方便地處理日曆事件,讓使用者輕鬆地將事件新增到他們的日曆中。這不僅提升了使用者體驗,也讓網站更具互動性。
WARNING使用注意事項:
- 在大部分的桌面瀏覽器中,點擊 iCal 連結會下載 .ics 檔案。
- 在 iOS 裝置上,點擊 iCal 連結可能會直接開啟行事曆應用程式,但有時也可能下載檔案。
- 在 Android 裝置上,點擊 iCal 連結通常會下載檔案。
JavaScript 日曆事件處理:輕鬆生成 iCal、Google 及 Yahoo 日曆連結
https://laplusda.com/posts/generate-ical-links/