代码之家  ›  专栏  ›  技术社区  ›  Vinko Vrsalovic

用c语言创建iCal文件#

  •  73
  • Vinko Vrsalovic  · 技术社区  · 16 年前

    引用可打印 字段-具有回车符和换行符的字段。

    例如,如果 描述 字段编码不正确,只有第一行会显示,可能会损坏*.ics文件中的其余信息。

    我在寻找可以生成*.ics文件的现有类和/或可以生成的类 领域。

    9 回复  |  直到 13 年前
        1
  •  73
  •   jocull    8 年前

    我使用 DDay.Ical ,这是好东西。 有能力打开一个ical文件并在一个好的对象模型中获取它的数据。上面写着beta,但对我们来说效果很好。

    编辑:2016年11月

    此库已被弃用,但已作为iCal.NET网站另一个开发人员。

    rianjs.net/2016/07/dday-ical-is-now-ical-net

    GitHub上的源: github.com/rianjs/ical.net

        2
  •  12
  •   Ian Oxley    16 年前

    我发现最简单的方法就是使用 microformats

    如果您希望生成iCalendar文件,那么可以使用 hCalendar microformat 然后包括一个链接,如“添加到日历”,指向:

    http://feeds.technorati.com/events/[

    然后Technorati页面解析您的页面,提取hCalendar信息并将iCalendar文件发送到客户机。

        3
  •  3
  •   atmarx    14 年前

     Private Function RFC2445TextField(ByVal LongText As String) As String
    
         LongText = LongText.Replace("\", "\\")
         LongText = LongText.Replace(";", "\;")
         LongText = LongText.Replace(",", "\,")
    
         Dim sBuilder As New StringBuilder
         Dim charArray() As Char = LongText.ToCharArray
    
         For i = 1 To charArray.Length
             sBuilder.Append(charArray(i - 1))
             If i Mod 74 = 0 Then sBuilder.Append(vbCrLf & " ")
         Next
    
         Return sBuilder.ToString
    
     End Function
    

    我用它来总结和描述我们的ICS提要。只需在行中输入已经预先添加的字段(例如LongText=“摘要:事件标题"). 只要您将缓存设置得足够长,操作成本就不会太高。

        4
  •  2
  •   azheglov    15 年前

    (ical 2.0)和引用的可打印文件不在一起。

    引用的可打印文件在 vCal公司 (vCal 1.0)表示不可打印字符,例如换行符(=0D=0A)。默认vCal编码是7位的,因此有时需要使用带引号的可打印字符来表示非ASCII字符(您可以覆盖默认编码,但不需要其他vCal兼容通信方理解它)

    iCal公司

    您可能需要支持您的客户/利益相关者以澄清需求。vCal和iCal之间似乎存在混淆。

        5
  •  1
  •   slolife    16 年前
        6
  •  1
  •   Dan Dan    15 年前

    根据RFC-2445,注释和描述字段是文本。测试场的规则是: [2] 包装是通过插入一个紧跟空白的CRLF来实现的。

    示例:下面是带格式的属性的示例 属性值中的换行符:

     DESCRIPTION:Meeting to provide technical review for "Phoenix"
       design.\n Happy Face Conference Room. Phoenix design team
       MUST attend this meeting.\n RSVP to team leader.
    
        7
  •  1
  •   VDWWD    7 年前

    //set a couple of variables for demo purposes
    DateTime IcsDateStart = DateTime.Now.AddDays(2);
    DateTime IcsDateEnd = IcsDateStart.AddMinutes(90);
    string IcsSummary = "ASP.Net demo snippet";
    string IcsLocation = "Amsterdam (Netherlands)";
    string IcsDescription = @"This snippes show you how to create a calendar item file (.ics) in ASP.NET.\nMay it be useful for you.";
    string IcsFileName = "MyCalendarFile";
    
    //create a new stringbuilder instance
    StringBuilder sb = new StringBuilder();
    
    //begin the calendar item
    sb.AppendLine("BEGIN:VCALENDAR");
    sb.AppendLine("VERSION:2.0");
    sb.AppendLine("PRODID:stackoverflow.com");
    sb.AppendLine("CALSCALE:GREGORIAN");
    sb.AppendLine("METHOD:PUBLISH");
    
    //create a custom time zone if needed, TZID to be used in the event itself
    sb.AppendLine("BEGIN:VTIMEZONE");
    sb.AppendLine("TZID:Europe/Amsterdam");
    sb.AppendLine("BEGIN:STANDARD");
    sb.AppendLine("TZOFFSETTO:+0100");
    sb.AppendLine("TZOFFSETFROM:+0100");
    sb.AppendLine("END:STANDARD");
    sb.AppendLine("END:VTIMEZONE");
    
    //add the event
    sb.AppendLine("BEGIN:VEVENT");
    
    //with a time zone specified
    sb.AppendLine("DTSTART;TZID=Europe/Amsterdam:" + IcsDateStart.ToString("yyyyMMddTHHmm00"));
    sb.AppendLine("DTEND;TZID=Europe/Amsterdam:" + IcsDateEnd.ToString("yyyyMMddTHHmm00"));
    
    //or without a time zone
    //sb.AppendLine("DTSTART:" + IcsDateStart.ToString("yyyyMMddTHHmm00"));
    //sb.AppendLine("DTEND:" + IcsDateEnd.ToString("yyyyMMddTHHmm00"));
    
    //contents of the calendar item
    sb.AppendLine("SUMMARY:" + IcsSummary + "");
    sb.AppendLine("LOCATION:" + IcsLocation + "");
    sb.AppendLine("DESCRIPTION:" + IcsDescription + "");
    sb.AppendLine("PRIORITY:3");
    sb.AppendLine("END:VEVENT");
    
    //close calendar item
    sb.AppendLine("END:VCALENDAR");
    
    //create a string from the stringbuilder
    string CalendarItemAsString = sb.ToString();
    
    //send the ics file to the browser
    Response.ClearHeaders();
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "text/calendar";
    Response.AddHeader("content-length", CalendarItemAsString.Length.ToString());
    Response.AddHeader("content-disposition", "attachment; filename=\"" + IcsFileName + ".ics\"");
    Response.Write(CalendarItemAsString);
    Response.Flush();
    HttpContext.Current.ApplicationInstance.CompleteRequest();
    
        8
  •  0
  •   Lance Fisher    16 年前

    iCal可能很复杂,所以我建议使用库。DDay是一个很好的免费解决方案。上一次我检查它没有完全支持重复发生的事件,但除此之外它看起来真的很好。一定要用几个客户端测试日历。

        9
  •  0
  •   Manpreet Singh Dhillon    7 年前

    我知道为时已晚,但它可能会帮助别人。在我的例子中,我编写了以下扩展名为.ics的文本文件

    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Calendly//EN
    CALSCALE:GREGORIAN
    METHOD:PUBLISH
    BEGIN:VEVENT
    DTSTAMP:20170509T164109Z
    UID:your id-11273661
    DTSTART:20170509T190000Z
    DTEND:20170509T191500Z
    CLASS:PRIVATE
    DESCRIPTION:Event Name: 15 Minute Meeting\nDate & Time: 03:00pm - 03:15pm (
     Eastern Time - US & Canada) on Tuesday\, May 9\, 2017\n\nBest Phone Number
      To Reach You :: xxxxxxxxx\n\nany "link": https://wwww.yahoo.com\n\n
    SUMMARY:15 Minute Meeting
    TRANSP:OPAQUE
    END:VEVENT
    END:VCALENDAR
    

    它对我有用。