What’s new in 3.0? Firstly, there’s a couple of things in 3.0 that just plain make it easier to use Noda Time:
Nullable reference types. The API now correctly uses the nullable reference types introduced in C# 8.0 to document when a method or property may accept or return a
Nullability was previously noted in our documentation, but now (with appropriate compiler support) you can opt-in to warnings that indicate where you might be accidentally passing a
nullsomewhere you shouldn’t.
A plethora of API improvements. For example, we now have a
YearMonthtype that can represent a value like “May 2020”;
TzdbDateTimeZoneSourcenow provides explicit dictionaries mapping between TZDB and Windows time zone IDs; and
DateAdjusters.AddPeriod()creates a date adjuster that can be used to add a
Periodto dates, along with many other improvements. As always, see the version history and API changes page for full details.
A single library version. Previous versions of Noda Time were slightly fragmented when it came to supporting different framework versions. For example, Noda Time 1.x was specific to the .NET Framework, and later added a Portable Class Library version that was missing a few key functions, while Noda Time 2.x again provided a separate .NET Standard version that differed slightly from the ‘full’ version. As of Noda Time 3.0, we have just one library version, providing the same functionality on all platforms.
Better support for other frameworks. Most core types are now annotated with TypeConverter and XmlSchemaProvider attributes. Type converters are used in various frameworks to convert one type into other (typically, to or from a string) — for example, ASP.NET will use type converters to convert query string parameters into typed values — while the XML schema attributes make it possible to build an XML schema programmatically for web services that make use of Noda Time types.
Although not as significant as the changes from Noda Time 1.x to 2.x, performance is still a key concern for Noda Time.
In 3.0.0, we’ve managed to eke out a little more performance for some common
operations: finding the earlier of two
LocalDate values now takes
somewhere between 40–60% of the time it did in Noda Time 2.x, while parsing
text strings as
LocalDate values using common (ISO-like)
patterns should also be a little faster, taking around 90% of the time it
did in Noda Time 2.x.
The change from Noda Time 2.x to 3.0 is not as big a change as the one from Noda Time 1.x to 2.0, but there are still some small incompatibilities to watch out for.
The migration document details everything that we’re aware of, but there are two points worth calling out explicitly:
Noda Time 3.x has (slightly) greater system requirements than Noda Time 2.x. While Noda Time 2.x required either .NET Framework 4.5+ or .NET Core 1.0+, Noda Time 3.x requires “
netstandard2.0”; that is, .NET Framework 4.7.2+ or .NET Core 2.0+.
.NET binary serialization is no longer supported. While .NET Core 2.0 added some support for binary serialization, binary serialization has many known deficiencies, and other serialization frameworks are now generally preferred. Accordingly, we have removed support for binary serialization entirely from Noda Time 3.x.
In general, though, we expect that most projects using Noda Time 2.x should be able to replace it with Noda Time 3.0.0 transparently.
Note that the serialization packages were decoupled from the main release during the 2.x releases, and so (for example) there is no new version of NodaTime.Serialization.JsonNet; the current version of that library will work just fine with Noda Time 3.0.0.
Good question. While Noda Time is fairly mature as a library, we do have a
few areas we’d like to explore for the future: making use of
text parsing, and providing a little more information from CLDR sources
(stable timezone IDs, for example). If you’re interested in helping out,
come and talk to us on the mailing list.
And once again, I’m going to copy/paste this to produce the official Noda Time blog post. (The evidence suggests that this is the only way I’ll get any content on my personal site, after all.) ↩