如何创建高级重复事件

时间:2017-02-23 14:50:56

标签: c# recurrence

我有一个C#应用程序,我需要创建一些"高级"反复发生的事件。

例如,我需要在每年的星期一,星期三和星期日每年的6月,7月和8月创建一个任务。

或者全年每隔一周,我想在每个星期一早上,每个星期一晚上和每个星期五中午创建一个任务,但不是在12月。

这看似愚蠢,但它反映了现实世界中的一些需求。

这甚至可能吗?我似乎无法找到支持这种复发的任何工具或技术,而不会在几次发生时将其拆分。

1 个答案:

答案 0 :(得分:0)

这根本不是傻:) 我也在研究同样的问题。我正在使用iCalendar的RRULE属性来实现此功能。 iCalendar是在计算机系统之间传输日历信息的标准方法。 您可以使用http://www.kanzaki.com/docs/ical/rrule.htmlhttps://icalendar.org/来了解所有重复出现的情况(每日,每周,每月,每年)。

  

使用iCal属性创建单个和重复事件的代码

    public string MakeRecurringEvent(AppointmentEvent message)
    {
    string startDay = "VALUE=DATE:" + GetFormatedDate(message.StartDate) + "T" + GetFormattedTime(message.StartTime);
    string endDay = "VALUE=DATE:" + GetFormatedDate(message.StartDate) + "T" + GetFormattedTime(message.EndTime);

    var organizer = "Listen To Customer Site Admin";
    var attendee = message.Attendee;
    string filePath = string.Empty;
    string path = HttpContext.Current.Server.MapPath(@"..\Content\Calendar\iCal\");
    filePath = path + message.Subject + ".ics";
    writer = new StreamWriter(filePath);

    writer.WriteLine("BEGIN:VCALENDAR");
    writer.WriteLine("VERSION:2.0");
    writer.WriteLine("METHOD:REQUEST");
    writer.WriteLine("PRODID:-//hacksw/handcal//NONSGML v1.0//EN");
    writer.WriteLine("BEGIN:VEVENT");     
    writer.WriteLine("ORGANIZER;CN=\"{0}\":MAILTO:{1}", organizer, message.Organizer);
    string[] arrAttendees = message.Attendee.Split(',');
    for (int countAtt = 0; countAtt < arrAttendees.Length - 1; countAtt++)
    {
        writer.WriteLine("ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"{0}\":MAILTO:{1}", attendee,
        arrAttendees[countAtt], arrAttendees[countAtt]);
    }        
    writer.WriteLine("DTSTART;" + startDay);
    writer.WriteLine("DTEND;" + endDay);
    if (message.IsRecurring)
    {
        switch (message.Frequency)
        {
            case "Daily":
                writer.WriteLine("RRULE:FREQ=DAILY;UNTIL={0}", GetFormatedDate(message.EndDate));
                break;
            case "Weekly":
                writer.WriteLine("RRULE:FREQ=WEEKLY;UNTIL={0}", GetFormatedDate(message.EndDate));
                break;
            case "Monthly1":
                writer.WriteLine("RRULE:FREQ=MONTHLY;INTERVAL={0};UNTIL={1}",message.RecurranceMonth, GetFormatedDate(message.EndDate));
                break;
            case "Monthly2":
                writer.WriteLine("RRULE;TZID=America/New_York:FREQ=MONTHLY;UNTIL={0};BYDAY=\"{1}\"", GetFormatedDate(message.EndDate)+"T"+ GetFormattedTime(message.StartTime), "1FR");                   
                break;
        }

    }


    writer.WriteLine("LOCATION:" + message.Location);
    writer.WriteLine("UID:{0}", Guid.NewGuid());
    writer.WriteLine("DESCRIPTION", message.From);
    writer.WriteLine("SUMMARY:" + message.Subject);      
    writer.WriteLine("ORANIZER:MAILTO:{0}", message.Organizer);        
    writer.WriteLine("X-ALT-DESC:FMTTYPE=text/html:{0}", message.Body);
    writer.WriteLine("END:VEVENT");
    writer.WriteLine("END:VCALENDAR");
    writer.Close();
    return filePath;
}