diff --git a/src/NmeaParser/Nmea/Rmc.cs b/src/NmeaParser/Nmea/Rmc.cs index d0bf862..d1cace5 100644 --- a/src/NmeaParser/Nmea/Rmc.cs +++ b/src/NmeaParser/Nmea/Rmc.cs @@ -42,15 +42,13 @@ namespace NmeaParser.Messages if (message[8].Length == 6 && message[0].Length >= 6) { - var year = int.Parse(message[8].Substring(4, 2), CultureInfo.InvariantCulture) + 2000; - var month = int.Parse(message[8].Substring(2, 2), CultureInfo.InvariantCulture); - var day = int.Parse(message[8].Substring(0, 2), CultureInfo.InvariantCulture); - var hour = int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture); - var minute = int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture); - var secondTicks = (long)(decimal.Parse(message[0].Substring(4), CultureInfo.InvariantCulture) * TimeSpan.TicksPerSecond); - - FixTime = new DateTimeOffset(year, month, day, hour, minute, 0, TimeSpan.Zero) - .AddTicks(secondTicks); + FixTime = new DateTimeOffset(int.Parse(message[8].Substring(4, 2), CultureInfo.InvariantCulture) + 2000, + int.Parse(message[8].Substring(2, 2), CultureInfo.InvariantCulture), + int.Parse(message[8].Substring(0, 2), CultureInfo.InvariantCulture), + int.Parse(message[0].Substring(0, 2), CultureInfo.InvariantCulture), + int.Parse(message[0].Substring(2, 2), CultureInfo.InvariantCulture), + 0, TimeSpan.Zero). + AddTicks((long)(double.Parse(message[0].Substring(4), CultureInfo.InvariantCulture) * TimeSpan.TicksPerSecond)); } Active = (message[1] == "A"); Latitude = NmeaMessage.StringToLatitude(message[2], message[3]); diff --git a/src/UnitTests/NmeaParser.Tests.NET/NmeaParser.Tests.Net.csproj b/src/UnitTests/NmeaParser.Tests.NET/NmeaParser.Tests.Net.csproj index 4941952..a75e184 100644 --- a/src/UnitTests/NmeaParser.Tests.NET/NmeaParser.Tests.Net.csproj +++ b/src/UnitTests/NmeaParser.Tests.NET/NmeaParser.Tests.Net.csproj @@ -1,7 +1,7 @@ - net472;net6.0 + net472;net6.0;net7.0;net8.0 false 8.0 diff --git a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs index a18bfbc..b6cbc1c 100644 --- a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs +++ b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs @@ -209,6 +209,19 @@ namespace NmeaParser.Tests Assert.AreEqual(0.019, rmc.Speed); } + [TestMethod] + [WorkItem(116)] + public void TestGprmc_DateCheck() + { + // Tests a behavior change in TimeSpan.AddSeconds introduced in .NET 7 + string input = "$GPRMC,141825.2,A,4249.92297,N,08548.52186,W,000.01,227.1,040322,005.5,W*54"; + var msg = NmeaMessage.Parse(input); + Assert.IsInstanceOfType(msg, typeof(Rmc)); + Rmc rmc = (Rmc)msg; + Assert.AreEqual("GPRMC", rmc.MessageType); + Assert.AreEqual(new DateTimeOffset(2022, 3, 4, 14, 18, 25, 200, TimeSpan.Zero), rmc.FixTime); + } + [TestMethod] public void TestGpgga() {