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

How to generate working .ics file from static website?

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

首先我尝试了这个 js 库来创建一个 .ics 文件:https://github.com/nwcell/ics.js - 我无法让它工作...
然后我尝试了一个调整后的叉子,我确实创建并下载了一个文件:https://github.com/matthiasanderer/icsFormatter

我在 Windows 10 上测试它,它在 MS Outlook 中成功打开,但后来我注意到文件没有在 Windows 日历应用程序中打开:
错误转化为类似:"The event couldn't be opened. Perhaps the calendar file is damaged."


在 iPhone 的 Safari 中,点击下载按钮时也会发生错误:
错误转化为类似:"Safari can not load this file."


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

Specifying the charset in the MIME Content-Type is mandatory


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

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

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


我希望我能给文件一个名字——但我发现这样做的唯一方法是 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.