diff --git a/src/Ical.Net.CoreUnitTests/VTimeZoneTest.cs b/src/Ical.Net.CoreUnitTests/VTimeZoneTest.cs index 36f3eddc..f5d58ddc 100644 --- a/src/Ical.Net.CoreUnitTests/VTimeZoneTest.cs +++ b/src/Ical.Net.CoreUnitTests/VTimeZoneTest.cs @@ -153,6 +153,21 @@ public void VTimeZoneAmericaLosAngelesShouldSerializeProperly() //Assert.IsTrue(serialized.Contains("RDATE:19600424T010000"), "RDATE:19600424T010000 was not serialized"); // NodaTime doesn't match with what tzurl has } + [Test, Category("VTimeZone")] + public void VTimeZoneEuropeOsloShouldSerializeProperly() + { + var iCal = CreateTestCalendar("Europe/Oslo"); + var serializer = new CalendarSerializer(); + var serialized = serializer.SerializeToString(iCal); + + Assert.IsTrue(serialized.Contains("TZID:Europe/Oslo"), "Time zone not found in serialization"); + Assert.IsTrue(serialized.Contains("BEGIN:STANDARD"), "The standard timezone info was not serialized"); + Assert.IsTrue(serialized.Contains("BEGIN:DAYLIGHT"), "The daylight timezone info was not serialized"); + Assert.IsTrue(serialized.Contains("BYDAY=-1SU;BYMONTH=3"), "BYDAY=-1SU;BYMONTH=3 was not serialized"); + Assert.IsTrue(serialized.Contains("BYDAY=-1SU;BYMONTH=10"), "BYDAY=-1SU;BYMONTH=10 was not serialized"); + + } + [Test, Category("VTimeZone")] public void VTimeZoneAmericaAnchorageShouldSerializeProperly() { diff --git a/src/Ical.Net/CalendarComponents/VTimeZone.cs b/src/Ical.Net/CalendarComponents/VTimeZone.cs index 08aff0d0..6e5118d1 100644 --- a/src/Ical.Net/CalendarComponents/VTimeZone.cs +++ b/src/Ical.Net/CalendarComponents/VTimeZone.cs @@ -254,9 +254,12 @@ public IntervalRecurrencePattern(ZoneInterval interval) var date = interval.IsoLocalStart.ToDateTimeUnspecified(); var weekday = date.DayOfWeek; - var num = DateUtil.WeekOfMonth(date); + var weekNumber = DateUtil.WeekOfMonth(date); - ByDay.Add(num != 5 ? new WeekDay(weekday, num) : new WeekDay(weekday, -1)); + if (weekNumber >= 4) + ByDay.Add(new WeekDay(weekday, -1)); // Almost certainly likely last X-day of month. Avoid issues with 4/5 sundays in different year/months. Ideally, use the nodazone tz database rule for this interval instead. + else + ByDay.Add(new WeekDay(weekday, weekNumber)); } }