如何创建高级重复事件

How to create advanced recurring events

我有一个 C# 应用程序,我需要在其中创建一些 "advanced" 重复事件。

比如我需要在每年6月、7月、8月的每个周一、周三、周日创建一个任务。

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

这可能看起来很愚蠢,但它反映了现实世界中的一些需求。

这有可能吗?我似乎找不到任何支持这种重复出现的工具或技术,而不会将其分成几次出现。

这一点都不傻:)。 我也在做同样的工作。我正在使用 iCalendar 的 RRULE 属性 来实现此功能。 iCalendar 是一种在计算机系统之间传输日历信息的标准方法。 您可以通过 http://www.kanzaki.com/docs/ical/rrule.html and https://icalendar.org/ 了解所有重复出现的场景(每日、每周、每月、每年)。

Code for creating single and recurring event using iCal properties

    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;
}