我有一个C#应用程序,我需要创建一些"高级"反复发生的事件。
例如,我需要在每年的星期一,星期三和星期日每年的6月,7月和8月创建一个任务。
或者全年每隔一周,我想在每个星期一早上,每个星期一晚上和每个星期五中午创建一个任务,但不是在12月。
这看似愚蠢,但它反映了现实世界中的一些需求。
这甚至可能吗?我似乎无法找到支持这种复发的任何工具或技术,而不会在几次发生时将其拆分。
答案 0 :(得分:0)
这根本不是傻:) 我也在研究同样的问题。我正在使用iCalendar的RRULE属性来实现此功能。 iCalendar是在计算机系统之间传输日历信息的标准方法。 您可以使用http://www.kanzaki.com/docs/ical/rrule.html和https://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;
}