A listing of what each Nuget package version represents.
Fix: Stop todo evaluation at given datetime.
(If a TODO had an RRULE without COUNT or UNTIL, IsCompleted() threw with ArgumentOutOfRangeException.)
The following RRULE cases are now implemented
- YEARLY + BYMONTH + numeric BYDAY offsets. Pattern:
FREQ=YEARLY;BYMONTH=6,9;BYDAY=2MO - YEARLY + numeric BYDAY without BYMONTH. Pattern:
FREQ=YEARLY;BYDAY=20MO - YEARLY + BYMONTH + negative numeric BYDAY. Pattern:
FREQ=YEARLY;BYMONTH=6,9;BYDAY=-1SU
Fix: Regression introduced in v5.1.3 affecting RRULE:FREQ=YEARLY when negative BYMONTHDAY or BYYEARDAY values are used. In certain combinations the evaluator could normalize negative positions incorrectly and skip valid occurrences (e.g., end‑of‑month or end‑of‑year instances). This has been fixed — please upgrade to v5.1.4.
Example of an affected rule (prior behavior could skip results):
DTSTART:20250101
RRULE:FREQ=YEARLY;BYYEARDAY=-1,1;BYMONTHDAY=-1,1Fix: Correct handling RRULE:FREQ=YEARLY combined with BYMONTH and BYWEEKNO. The previous implementation could skip occurrences in some scenarios.
Fix: Correct handling RRULE:FREQ=YEARLY when BYMONTH ist missing, e.g. RRULE:FREQ=YEARLY;INTERVAL=2;BYDAY=MO,TU. Now takes the month of DTSTART as a limiter.
- Chore: Mark classes and interfaces using
EXRULEas obsolete. Reasoning:EXRULEis marked as deprecated in RFC 5545. Neither Google Calendar nor Microsoft Outlook/Exchange support it. - Feat:
CalDateTime.Add(Duration)for emptyDurations. The methods gets called frequently during recurrence evaluation. Here it brings a performance improvement of about 10%. - Fix:
FREQ=WEEKLYrules that includeBYMONTHwere only including weeks that start inside the given months. This fix checks the end of the week also to see if any part of the week is inside the given months.
- Fix:
CalendarEvents withRecurrenceIdwere not properly evaluated in some scenarios. - Feat:
RecurringComponents likeCalendarEventsupportRECURRENCE-IDwith optionalRANGEparameter for serialization and deserialization. - Wiki: Updated articles about recurrence evaluation
- Fix: Exception for Blazor WebAssembly and Self-Contained Assemblies using
FileVersionInfo - Fix: GetOccurrences() NPE when returning a ToDo's occurrences that don't have a duration
- Fix: Evaluation of
EXDATEwhen date-only whileDTSTARTis date-time - Feat: Use UTF-8 Encoding without BOM by default in all serializers when writing to a stream. This is expected by most iCalendar consumers, including Outlook and Google Calendar.
- Fix:
CalDateTimeCTOR using ISO 8601 UTC string resolves to UTC - Fix:
GetOccurrences(periodStart)to also include ongoing occurrences (beginning beforeperiodStart) - Fix:
GetOccurrences()not properly dealing withperiodStart's timezone ID
- Breaking: Remove redundant
EqualsandGetHashCodeimplementations in #810 - Breaking:
Occurrence.Periodis determined byStartTimeandDurationonly in #808 - Update package versions in #813 which includes
NodaTimeversion 3.2.2 - Fix:
Period.CollidesWithcalculation in #812 - Added a Migration Guide for v4 to v5 to the wiki
- Update the list of API Changes from v4 to v5 in the wiki
- Publish v5.0.0 GA
- Breaking: Enable NRT project wide in #769, #771, #772, #778, #786. NuGet Packages are now published with NRT enabled.
- Update license.md in #773
- EvaluationOptions: Fix off-by-one issue of
MaxUnmatchedIncrementsLimit#775 - RecurrencePatternEvaluator: Modernize some evaluation code in #783
- Breaking: Evaluation: Remove
periodEndparam fromGetOccurrenceset al in #781. To limit the elements, it's recommended to usedCollectionExtensions.TakeWhileBefore(see below), or simpleTakeWhile. - Implement
CollectionExtensions.TakeWhileBeforeextensions in #796. This can e.g. be used on enumerations fromGetOccurrencesmethods - Evaluation: Raise
EvaluationOutOfRangeExceptionif year 10k is hit during evaluation in #785 - Remove unnecessary null checks in #790
- Breaking: Refactor handling of FREQ in recurrence pattern in #789. Removed
FrequencyType.Nonefrom enumFrequencyType - Breaking: Remove
GroupedListEnumeratorin #793 (Different solution made it redundant). - Enable
CA1305warnings and fix them in #794 - Fix for serialization of property parameters:
CalendarComponent.AddPropertyadds theCalendarPropertyin #801 - Breaking: Feature: Serialize multiple categories and resources to one line in #803 and #804
- Fix incorrect handling of UNTIL if falling into DST change and some related improvements in #738
- Fix: Minor NRT warnings with Recurrence in #743
- Fix: Benchmarks in #746
- Replace
DateTimewithCalDateTimeinRecurrencePatternEvaluatorand related code in #742 - Evaluation: Make
MaxIncrementCountconfigurable in #750 - Fix issue with
BYWEEKNO=1whereUNTILlies in the year prior to the year of the week of the last occurrence. in #752 - Remove
IServiceProviderin #753 - Update
PRODIDandVERSIONproperty handling in #748 - Enhance
RecurrencePatternSerializerin #758 - Evaluation: Avoid dependency on local culture settings. in #759
- Change
DateTimemethod args toCalDateTimein #761 - Enable NRT in #762, #763, #764, #765. Note: The current packages are created with
NRTdisabled, The v5 final release will be fully NRT compliant. - Fix positive/nagative args in
DurationCTOR in #767
- Make the time zone resolver plugable
- Make
CalendarEvent.EffectiveDurationand some conversion functions public. - Fix: Incorrect expansion behaviour after
BYWEEKNO
- Fix: Derive correct file and assembly version from package version in #726
- Fix inverted limiting behavior of
BYMONTHDAYby @minichma in #730
- This is the first public pre-release of the next major version of Ical.Net. It's an extensive rewrite of the library, with a focus on performance, correctness and usability. All issues reported in prior versions have been addressed, and the library has been thoroughly tested, also using the libical test suite.
- We strongly recommend using the pre-release packages, as they are more stable and feature-complete than the v4.x versions.
- Feedback is highly appreciated.
- Breaking changes from v4 are currently listed here.
- 4.3.1 - (2024-10-14)
- Update Ical.Net.csproj to use NodaTime 3.2.0 instead of 3.1.12. NodaTime v3.2.0 which brings some welcome changes
- Replace Ical.Net.nuspec with Directory.Build.props
- Remove unnecessary nuget dependencies, so
NodaTimeis again the only one
- 4.3.0 - (2024-10-13)
- Update the repository from fork
laget.se/ical net -
- Remove net5.0 as target framework from all projects
- Merged a few pull requests that fixes a few bugs
- #584, #579, #571, #528, #525, #471, #470, #443
- Update CI workflows
publish.ymlandtests.yml - Update ProdId constant and NodaTime package version
- Add back assembly signing to projects and include strong name key
- Add class
RegexDefaultsand update all Regex withRegexDefaults.Timeoutwhich is set to 200 milliseconds
- Update the repository from fork
- 4.2.0 - (2021-04-10) - Many bugbixes from the community
- Fix infinite loop with MaxDate for GetOccurrences #364
- Deserializes STANDARD and DAYLIGHT timezone infos #420
- BYWEEKNO & BYMONTHNO fix for ISO-8601 formatting #463
- Fixed bug where changing a property value appended the value instead of clearing it. #450
- Fixed
IsActiveregression #449 - Fixed bug where ordering of week numbers mattered for equality #513
- Target
netstandard20andnet50, unified build targets - Updated to NodaTime 3 and
netcoreapp3.1for unit tests (later changed tonet50) #449
- 4.1.11 - (2019-03-21) - Add some conditional debug symbols so VSTS doesn't choke on strong-named assemblies. Thanks, eriknuds #442
- 4.1.10 - (2019-01-31) - Strong-named assemblies. Thanks, josteink #159
- 4.1.9 - (2018-07-18) - Associate attachments with their events when VALUE is BINARY. Without the association, parameters such as FMTTYPE would be lost. PR 411
- 4.1.8 - (2018-06-12) -
PRODIDandVERSIONare unconditionally set when serializing a calendar so as not to mislead consumers about where the serialized output came from. Previous behavior would use the values that came from deserialization. #403 - 4.1.6 - (2018-06-01) - Target
net46instead ofnet45. It seems thatSystem.Reflection.TypeExtensions, doesn't support framework versions below 4.6. Bummer. - 4.1.5 - (2018-05-28)
- 4.1.4 - (2018-05-24) - #392. .NET Standard (still) doesn't play nicely with .NET Framework applications, so I have also targeted .NET 4.6 (
net46). As a consequence of that, I had to downgradeSystem.Reflection.TypeExtensionsto 4.1.0, because the original targeted version (4.3.0) was retargeted asnetstandard2.0, rendering it incompatible with anetstandard1.3library. - 4.1.2 - (2018-05-21) - #388. Bugfix: Specifying a time zone identifier in the
CalDateTimeconstructor should override the backingDateTime'sKindproperty. If no time zone identifier is specified, then theKindproperty shouldn't be changed. - 4.1.1 - (2018-05-21) - #387. Bugfix: Calling
CalDateTime.AsUtccaches the UTC time, but the cache was not being reset if theTzIdproperty changed. - 4.1.0/4.0.7 - (2018-05-15) - #383. Add a read-only
AsDateTimeOffsetproperty toIDateTime. Add a few docs toRecurrencePattern. - 4.0.6 - (2017-11-28) - #344. Fix the VERSION property so it's 2.0 as RFC-5545 requires.
- 4.0.4 PR 341. Cache the UTC representation for
CalDateTimes. This results in a 12-16% reduction in unit test runtime. - 4.0.3 #337. Fixed a bug in
SimpleDeserializerwhere tab characters (\t) were excluded from regex match. - 4.0.1 #335. Technically this should be 5.0, but given 4.0.0 only has 24 downloads, I've just done a minor version bump.
- Moved everything from Ical.Net.Collections into the Ical.Net assembly.
- Updated the
PRODIDstamp to say 4.0. - Fixed a bug with a missing nuget dependency
- 4.0.0:
DateTimeKindis preserved during serialization round trips.Zsuffixed (i.e. UTC)DATE-TIMEs produce aDateTimeKind.Utc, and everything else produces aDateTimeKind.Local. Similarly, when creatingCalDateTimes with ambiguous timezones, theDateTimeKindis examined in an attempt to infer whether it's a UTC time or not. In order of importance, the way of determiningDateTimeKindis: time zone id,DateTimeKindon the incomingDateTime, and then a fallback. This should improve interop with other ical libraries like Telerik. #331RRULE'sUNTILproperty is now inclusive, and doesn't rely on UTC time comparisons. #320CalDateTime.ToTimeZoneproduces the correct local time #330VEVENTstatus should be uppercase during serialization. A subtle (but breaking) change, necessitating a major version bump. #318VTIMEZONEs are once again serialized, this time pulling historic time zone data from NodaTime -- thanks beriniwlew! PR 304- Entry points are now consolidated into the right places, and make sense:
CalendarCollection.Load()loads aCalendarCollectionCalendar.Loadloads aCalendar.CalendarComponent.Load()loads whatever type you're looking for.
- The ANTLR-based parser is gone. chescock's
SimpleDeserializeris used everywhere.
- 3.0.15: .NET Standard version (aka v3 aka
net-core) is missing System.Reflection.TypeExtensions dependency. #326 - 3.0.14: .NET Standard version (aka v3 aka
net-core) is missing System.Runtime.Serialization.Primitives dependency. #324 - 3.0.13:
DTSTARTis not required forVTODOcomponents. PR 322 - 3.0.12: Several improvements rolled up:
- 3.0.11-net-core-beta: Targeting netstandard1.3 and net46
- 3.0.10-net-core-beta: Reverts a change made in 3.0.3 which allowed UTC timestamps to specify
TZID=UTCinstead of being suffixed withZ. The spec requiresZsuffixes, and broke many applications, including Outlook. #263 - 3.0.9-net-core-beta: Bugfixes:
PeriodListnow fully implementsIList<Period>. Keep data structures in sync in GroupedList.Remove() #253. Fix for StackOverflow exception #257. UnitTests can now be run in VS test runner! - 3.0.8-net-core-alpha: Bugfix: Better CalDateTime equality and hashing, because time zones matter. #275
- 3.0.7-net-core-alpha: Bugfix: Fixed a small ordering bug when evaluating
EXDATEs andRDATEs #275 - 3.0.6-net-core-alpha: Bugfix:
CalendarEvent'sEquals()andGetHashCode()were buggy in that they did not considerRecurrenceDatesandExceptionDatesproperly. Both methods treated these properties as if they were a single collection. Now they are normalized by time zone when before determining whether complete set ofRDATEs orEXDATEs are the same. #275 - 3.0.4-net-core-alpha:
CalendarEvent'sEquals()andGetHashCode()methods were asymmetric. Both now considerAttachments. In addition, several calendar components did not implementEquals()andGetHashCode(), namelyJournalandTodo. They both delegate toRecurringComponentfor the properties owned by that parent object, and extend the methods for the child properties that they respectively own. #271 - 3.0.3-net-core-alpha: Bringing in 2.2.34's changes: serializing
EXDATEs andRDATEs now includes time zone information when specified. UTC timestamps are now allowed to be specified either inZ-suffixed form (which was mandatory before), OR explicitly with a time zone id (TZID=UTC). This allows greater interop with third-party libraries like Telerik's RadSchedule. #259PeriodListnow implementsIList<Period>. - 3.0.2-net-core-alpha: Fix nuspec file to declare NodaTime as dependency
- 3.0.1-alpha: Initial publishing of .NET Core release
- 2.3.6 - (2019-01-30) - Strong-named assemblies. Thanks, josteink #159
- 2.3.5:
VTIMEZONEs are once again serialized, this time pulling historic time zone data from NodaTime -- thanks beriniwlew! PR 304 - 2.3.4:
DTSTARTis not required forVTODOcomponents. PR 322 - 2.3.3: Several improvements rolled up:
- 2.3.2: Reverts a change made in 2.2.34 which allowed UTC timestamps to specify
TZID=UTCinstead of being suffixed withZ. The spec requiresZsuffixes, and broke many applications, including Outlook. #263 - 2.3.0: PeriodList now implements
IList#280 - 2.2.39: Bugfix: Better CalDateTime equality and hashing, because time zones matter. #275
- 2.2.38: Bugfix: Fixed a small ordering bug when evaluating
EXDATEs andRDATEs #275 - 2.2.37: Bugfix:
Event'sEquals()andGetHashCode()were buggy in that they did not considerRecurrenceDatesandExceptionDatesproperly. Both methods treated these properties as if they were a single collection. Now they are normalized by time zone when before determining whether complete set ofRDATEs orEXDATEs are the same. #275 - 2.2.35: Bugfix:
Event'sEquals()andGetHashCode()methods were asymmetric. Both now considerAttachments. In addition, several calendar components did not implementEquals()andGetHashCode(), namelyJournalandTodo. They both delegate toRecurringComponentfor the properties owned by that parent object, and extend the methods for the child properties that they respectively own. #271 - 2.2.34: Serializing
EXDATEs andRDATEs now includes time zone information when specified. UTC timestamps are now allowed to be specified either inZ-suffixed form (which was mandatory before), OR explicitly with a time zone id (TZID=UTC). This allows greater interop with third-party libraries like Telerik's RadSchedule. #259 - 2.2.33: Bugfix for #235 when years have 53 weeks. Contains a new deserializer that's twice as fast as the default ANTLR implementation, and several other (smaller) performance enhancements. This will become the default deserializer in a future release. PR 246, PR 247
- 2.2.31: .NET's UTC offset parsing semantics don't match the RFC (which allows for
hhmmssUTC offsets), so I extended the offset serializer to account for these differences. (#102, #236) - 2.2.30:
Event.Resourcesis anIListagain. Event.Resources wasn't being deserialized, so I have reverted back to an IList to fix this. Sorry everyone. I'm intentionally violating my own semver rules. In the future, I'll call version n+1 "vNext" so I can more freely rev the major version number. - 2.2.29: Calling
GetOccurrences()on a recurrable component should recompute the recurrence set. SpecifyingEXDATEvalues that don't have aTimeOfDaycomponent should "black out" that day from a recurring component'sStartTime.#223 - 2.2.25: Fix for Collection was modified exception, and better handling of recurrence ids when calling
Calendar.GetOccurrences(#188) (#148) - 2.2.24: Performance enhancement for solidus-prefixed time zones (#204).
- 2.2.23: Bugfix for culture for geographic location serialization. RFC-5545 requires coordinates to use decimal points, not commas, regardless of culture. Correct:
1.2345. Incorrect:1,2345. (#202) - 2.2.22: Bugfix for
Eventserialization that always changed theDurationto 0. Serialization shouldn't have side effects. (#199)
Changes weren't systematically tracked before 2.2.22.