如何创建高级重复事件
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;
}
我有一个 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;
}