-
|
I am currently using 2.3.2 in framework 4.8 but now I am migrating dot net core 9 with iCal.Net 5.0.0. How to upgrade this code? currently it is giving following errror: "Exception of type 'System.StackOverflowException' was thrown." void Main()
{
var calendarHelper = new CalendarHelper();
var calendarEvent = new CalendarEvent
{
ID = 1,
Start = Convert.ToDateTime("2020-05-01 00:00:00.000"),
End = Convert.ToDateTime("2020-05-01 00:00:00.000"),
IsAllDay = true,
RecurrenceRule = "FREQ=YEARLY;BYDAY=MO,TU,WE,TH,FR;BYMONTH=5;BYSETPOS=1",
AlertTimespanString = "00.00:00:00"
};
TimeSpan interval = TimeSpan.FromMinutes(10);
var minDateTime = DateTime.Today.Subtract(interval);
var maxDateTime = DateTime.Today.Add(interval);
var notificationPeriod = new Period(new CalDateTime(minDateTime), new CalDateTime(maxDateTime));
var recurrenceDate = calendarHelper.GetRecurrenceDate(calendarEvent, notificationPeriod, true);
recurrenceDate.Dump();
}
public class CalendarHelper
{
public DateTime? GetRecurrenceDate(CalendarEvent calendarEvent, IPeriod period, bool useAlertTime = false)
{
var iCal = new Calendar();
var evt = iCal.Create<Event>();
evt.Start = new CalDateTime(calendarEvent.Start);
evt.End = new CalDateTime(calendarEvent.End);
if (calendarEvent.IsAllDay)
{
evt.IsAllDay = true;
var allDayStart = calendarEvent.Start;
evt.Start = new CalDateTime(allDayStart.Year, allDayStart.Month, allDayStart.Day);
evt.End = null;
}
if (!string.IsNullOrEmpty(calendarEvent.RecurrenceRule))
{
evt.RecurrenceRules.Add(new RecurrencePattern(calendarEvent.RecurrenceRule));
}
if (!string.IsNullOrEmpty(calendarEvent.RecurrenceException))
{
evt.ExceptionDates.Add(new PeriodList(calendarEvent.RecurrenceException.Replace(";", ",").TrimEnd(',')));
}
var occurancePeriod = period;
var alertTime = !string.IsNullOrWhiteSpace(calendarEvent.AlertTimespanString)
? calendarEvent.Start.Subtract(calendarEvent.AlertTimespan.Value)
: calendarEvent.Start;
if (useAlertTime && alertTime != calendarEvent.Start)
{
if (alertTime < calendarEvent.Start)
{
var diff = calendarEvent.Start - alertTime;
occurancePeriod = new Period(period.StartTime.Add(diff), period.EndTime.Add(diff));
}
else
{
var diff = alertTime - calendarEvent.Start;
occurancePeriod = new Period(period.StartTime.Subtract(diff), period.EndTime.Subtract(diff));
}
}
var occurences = evt.GetOccurrences(occurancePeriod.StartTime, occurancePeriod.EndTime);
foreach (var occurence in occurences)
{
var start = DateUtil.GetSimpleDateTimeData(occurence.Period.StartTime);
var periodStart = DateUtil.GetSimpleDateTimeData(occurancePeriod.StartTime);
// fix occurence from before notificationStart
if (start >= periodStart)
{
return start;
}
}
return default;
}
}
public class CalendarEvent
{
public int ID { get; set; }
public string? UserName { get; set; }
public string? Description { get; set; }
public DateTime Start { get; set; }
public string? StartTimezone { get; set; }
public DateTime End { get; set; }
public string? EndTimezone { get; set; }
public bool IsAllDay { get; set; }
public string? RecurrenceRule { get; set; }
public string? RecurrenceException { get; set; }
public TimeSpan? AlertTimespan
{
get => string.IsNullOrEmpty(AlertTimespanString) ? default : TimeSpan.Parse(AlertTimespanString);
set => AlertTimespanString = value?.ToString(@"dd\.hh\:mm\:ss");
}
public DateTime? AlertTime { get; set; }
public string? AlertTimespanString { get; set; }
public bool Closed { get; set; }
public string? ClosedBy { get; set; }
public DateTime? ClosedOn { get; set; }
public int? LocationID { get; set; }
public bool Deleted { get; set; }
} |
Beta Was this translation helpful? Give feedback.
Answered by
axunonb
Jul 15, 2025
Replies: 1 comment 5 replies
-
|
When coming from v2, the recommendation is to rewrite these few lines of code from scratch. |
Beta Was this translation helpful? Give feedback.
5 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment

Examples are updated now for v5