From b520568ed5bb5bfd5218df74b5cb57ca4e0eae5b Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sat, 17 Oct 2026 23:56:17 +0200 Subject: [PATCH] Noda Time: .NET 10, NodaTime 3.3.5, FromUnixTimeSeconds fix, ZonedDateTime rename, DST arithmetic tests - Retarget both projects to net10.0; NodaTime 3.1.9 to 3.3.5 - Test packages: xunit 2.9.3, xunit.runner.visualstudio 4.0.1, Microsoft.NET.Test.Sdk 18.11.0, coverlet.collector 10.1.0 - The Unix epoch test passed seconds to FromUnixTimeTicks; it now uses FromUnixTimeSeconds and asserts the UTC date - ZoneDateTime renamed to ZonedDateTime in the test name and variable - New tests: Duration on a ZonedDateTime across the New York DST gap, Period on a LocalDateTime, Duration as nanoseconds on a LocalDateTime, and TimeProvider.ToClock() --- .../HandlingDatesWithNodaTime.csproj | 4 +- .../Tests/NodaTimeUnitTest.cs | 63 ++++++++++++++++--- .../Tests/Tests.csproj | 10 +-- 3 files changed, 61 insertions(+), 16 deletions(-) diff --git a/dotnet-datetime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime.csproj b/dotnet-datetime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime.csproj index 470348a459..b15fde6806 100644 --- a/dotnet-datetime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime.csproj +++ b/dotnet-datetime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime/HandlingDatesWithNodaTime.csproj @@ -2,13 +2,13 @@ Exe - net7.0 + net10.0 enable enable - + diff --git a/dotnet-datetime/HandlingDatesWithNodaTime/Tests/NodaTimeUnitTest.cs b/dotnet-datetime/HandlingDatesWithNodaTime/Tests/NodaTimeUnitTest.cs index 45df5a38ae..4ca8de48ae 100644 --- a/dotnet-datetime/HandlingDatesWithNodaTime/Tests/NodaTimeUnitTest.cs +++ b/dotnet-datetime/HandlingDatesWithNodaTime/Tests/NodaTimeUnitTest.cs @@ -27,14 +27,15 @@ public void WhenUtcDateIsSpecified_ThenReturnInstantFromUtcDate() } [Fact] - public void WhenFromUnixTimeTicksMethodIsCalled_ThenReturnInstantFromUnixTicks() + public void WhenFromUnixTimeSecondsMethodIsCalled_ThenReturnInstantFromUnixSeconds() { var epochTime = 1693153840; - var instant = Instant.FromUnixTimeTicks(epochTime); - var unixTimeTicks = instant.ToUnixTimeTicks(); + var instant = Instant.FromUnixTimeSeconds(epochTime); + var unixTimeSeconds = instant.ToUnixTimeSeconds(); - Assert.Equal(epochTime, unixTimeTicks); + Assert.Equal(epochTime, unixTimeSeconds); + Assert.Equal(Instant.FromUtc(2023, 8, 27, 16, 30, 40), instant); } [Fact] @@ -109,14 +110,14 @@ public void WhenDifferentTimesArePassed_ThenCompareThemAndReturnResult() } [Fact] - public void WhenLocalDateTimezoneAndDateTimezoneAreCombined_ThenReturnZoneDateTime() + public void WhenLocalDateTimezoneAndDateTimezoneAreCombined_ThenReturnZonedDateTime() { var localDateTime = new LocalDateTime(2023, 8, 31, 15, 30); var timezone = DateTimeZoneProviders.Tzdb["Africa/Cairo"]; - var zoneDateTime = localDateTime.InZoneLeniently(timezone); + var zonedDateTime = localDateTime.InZoneLeniently(timezone); - Assert.Equal("Africa/Cairo", zoneDateTime.Zone.Id); + Assert.Equal("Africa/Cairo", zonedDateTime.Zone.Id); } [Fact] @@ -127,7 +128,7 @@ public void WhenDurationsAreAdded_ThenReturnSumOfDuration() var sumOfDurations = durationInDays + durationInHours; - Assert.Equal( 1.125, sumOfDurations.TotalDays); + Assert.Equal(1.125, sumOfDurations.TotalDays); } [Fact] @@ -224,5 +225,49 @@ public void WhenTimeZoneIsSpecified_ThenReturnDateTimeZone() Assert.NotNull(newYorkTimeZone); Assert.Equal(timeZoneId, newYorkTimeZone.Id); } -} + [Fact] + public void WhenDurationIsAddedToZonedDateTime_ThenElapsedTimeCrossesTheDstGap() + { + var newYork = DateTimeZoneProviders.Tzdb["America/New_York"]; + var start = new LocalDateTime(2026, 3, 8, 1, 30).InZoneStrictly(newYork); + + var later = start + Duration.FromHours(1); + + Assert.Equal(new LocalDateTime(2026, 3, 8, 3, 30), later.LocalDateTime); + Assert.Equal(Duration.FromHours(1), later.ToInstant() - start.ToInstant()); + } + + [Fact] + public void WhenPeriodIsAddedToLocalDateTime_ThenOnlyTheWallClockMoves() + { + var newYork = DateTimeZoneProviders.Tzdb["America/New_York"]; + var start = new LocalDateTime(2026, 3, 8, 1, 30); + + var later = start + Period.FromHours(1); + + Assert.Equal(new LocalDateTime(2026, 3, 8, 2, 30), later); + Assert.Throws(() => later.InZoneStrictly(newYork)); + } + + [Fact] + public void WhenDurationIsAddedAsNanoseconds_ThenLocalDateTimeMovesByThatAmount() + { + var start = new LocalDateTime(2026, 3, 8, 1, 30); + var duration = Duration.FromMinutes(90); + + var later = start.PlusNanoseconds(duration.ToInt64Nanoseconds()); + + Assert.Equal(new LocalDateTime(2026, 3, 8, 3, 0), later); + } + + [Fact] + public void WhenTimeProviderIsConvertedToClock_ThenReturnCurrentInstant() + { + IClock clock = TimeProvider.System.ToClock(); + + var instant = clock.GetCurrentInstant(); + + Assert.True(instant != default); + } +} diff --git a/dotnet-datetime/HandlingDatesWithNodaTime/Tests/Tests.csproj b/dotnet-datetime/HandlingDatesWithNodaTime/Tests/Tests.csproj index c9dace6a1c..3660c69ce6 100644 --- a/dotnet-datetime/HandlingDatesWithNodaTime/Tests/Tests.csproj +++ b/dotnet-datetime/HandlingDatesWithNodaTime/Tests/Tests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -10,13 +10,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all