Fix RMC FixTime parsing that can lose sub-second precision with doubles (#117)

* Extract local variables for the parameters of DateTimeOffset

* Add seconds to FixTime as Ticks in order to preserve sub-second precision that can get lost by using doubles

---------

Co-authored-by: Justin King <justin.king@vibrationresearch.com>
This commit is contained in:
Justin King 2024-11-19 23:09:29 -05:00 committed by GitHub
parent c0eb011711
commit 8e19dfebe6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -42,12 +42,15 @@ namespace NmeaParser.Messages
if (message[8].Length == 6 && message[0].Length >= 6)
{
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).AddSeconds(double.Parse(message[0].Substring(4), CultureInfo.InvariantCulture));
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);
}
Active = (message[1] == "A");
Latitude = NmeaMessage.StringToLatitude(message[2], message[3]);