javascript - 如何从静态网站生成工作 .ics 文件?

标签 javascript icalendar

我想创建一个带有日历条目下载功能的静态html网站,它应该可以在新浏览器上运行(不需要IE)。

首先,我尝试使用此 js 库来创建 .ics 文件:https://github.com/nwcell/ics.js - 我无法让它工作...
然后我尝试了一个调整后的 fork ,我确实可以使用以下命令创建和下载文件:https://github.com/matthiasanderer/icsFormatter

我正在 Windows 10 上对其进行测试,它在 MS Outlook 中成功打开,但随后我注意到该文件未在 Windows 日历应用中打开:
该错误翻译为:“无法打开该事件。可能日历文件已损坏。”
Windows Calendar App Error Message

<小时/>

在 iPhone 上的 Safari 中,点击下载按钮时也会出现错误:
该错误翻译为:“Safari 无法加载此文件。”
Safari error message

<小时/>

我使用此工具验证了生成的 .ics 文件:http://ical-validator.herokuapp.com/validate/ ,调整了 JS 代码以消除几乎所有错误 - 我不知道最后一个我不知道如何消除的错误是否是必要的:

Specifying the charset in the MIME Content-Type is mandatory

Validation Error
我认为 MIME 类型不应该是问题,因为它是在 JS-download 函数中定义的:

window.open("data:text/calendar;charset=utf-8," + escape(calendar));
<小时/>

我还想知道为什么下载在 Chrome 中工作正常,但 Firefox (V.72) 下载的文件的结尾是文件的两倍:。 ics.ics
Double file ending

<小时/>

我希望可以给该文件命名 - 但我发现这样做的唯一方法是 this answer 底部的 .csv 文件。它不起作用 - 我认为 encodeURI 函数破坏了我的换行符或其他东西。

<小时/>

这是我生成的 .ics 文件的内容:

BEGIN:VCALENDAR
PRODID:-//test//cal_events/NONSGML v1.0//DE
VERSION:2.0
BEGIN:VEVENT
UID:b1e4da94-1550-453f-bdee-a085a0b14231
CLASS:PUBLIC
DESCRIPTION:This is the description...
DTSTAMP:20200125T084646Z
DTSTART:20200229T190000z
DTEND:20200229T230000z
LOCATION:Deutschland
SUMMARY:Event Title
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR
<小时/>

看起来像this question类似...

最佳答案

DTSTART 和 DTEND 都有小写 z 作为后缀,而不是大写 Z

DTSTART:20200229T190000z
DTEND:20200229T230000z

参见https://www.rfc-editor.org/rfc/rfc5545#section-3.3.5

The date with UTC time, or absolute time, is identified by a LATIN CAPITAL LETTER Z suffix character, the UTC designator, appended to the time value.

关于javascript - 如何从静态网站生成工作 .ics 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59907734/

相关文章:

design-patterns - SED 删除两个模式之间的特定行?

coldfusion - 如何让 iCalendar 订阅在多个浏览器/操作系统之间工作?

c# - 如何使用 DDay.iCal 设置时区

ios - Ekevents 在日历中多次添加?

javascript - LexicalEnviroment 对象和 [[Environment]] 之间的关系

javascript - 内部指令与主指令的通信 - 调用函数

javascript - 如何找到node中递归运行的函数?

c# - 替换现有的 Outlook 日历约会

javascript - 点击事件覆盖自身 jQuery

javascript - 如何通过 Javascript 更改 HTML header ?