Parse date and time (mmddyy and hhmmss.sss) format to UTC DateTime(fullYear, month, day, hours, minutes, seconds, milliseconds, DateTimeKind.Utc)

This commit is contained in:
Joachim Spange 2025-01-29 13:59:40 +01:00
parent 128a8b1604
commit 647ff9fd0b

View file

@ -309,6 +309,68 @@ namespace NmeaParser.Messages
return TimeSpan.Zero;
}
/// <summary>
/// Parse from mmddyy + hhmmss.ss to DateTime (used in e.g. Ggk)
/// https://receiverhelp.trimble.com/alloy-gnss/en-us/NMEA-0183messages_PTNL_GGK.html
/// </summary>
internal static DateTime? StringsToUtcDateTime(string dateField, string timeField)
{
if (string.IsNullOrWhiteSpace(dateField) || string.IsNullOrWhiteSpace(timeField))
return null;
// 2. Parse date (mmddyy)
// - Typically the year is 2 digits; you must decide how to handle the century.
// - For example, if year < 80 => 20xx; else => 19xx
if (dateField.Length < 6) return null;
if (!int.TryParse(dateField.Substring(0, 2), out int month)) return null; // mm
if (!int.TryParse(dateField.Substring(2, 2), out int day)) return null; // dd
if (!int.TryParse(dateField.Substring(4, 2), out int year)) return null; // yy
int fullYear = (year < 80) ? (2000 + year) : (1900 + year);
// 3. Parse time (hhmmss.ss)
// - The fractional seconds might be optional or might have variable length.
// - Parse hours, minutes, and then the part after the decimal.
// - Time can be "hhmmss", or "hhmmss.sss", etc.
// Example: "102939.00" => hh=10, mm=29, ss=39, fraction=0
if (timeField.Length < 6) return null;
if (!int.TryParse(timeField.Substring(0, 2), out int hours)) return null; // hh
if (!int.TryParse(timeField.Substring(2, 2), out int minutes)) return null; // mm
// The seconds part can have a decimal fraction
// So we split around the decimal point:
double secondsDouble;
if (timeField.Length > 4)
{
string secString = timeField.Substring(4); // "39.00 in example above"
if (!double.TryParse(secString,
System.Globalization.NumberStyles.Float,
System.Globalization.CultureInfo.InvariantCulture,
out secondsDouble))
{
return null;
}
}
else
{
secondsDouble = 0.0;
}
int seconds = (int)secondsDouble;
int milliseconds = (int)((secondsDouble - seconds) * 1000.0);
// 4. Construct the UTC DateTime
try
{
var result = new DateTime(fullYear, month, day, hours, minutes, seconds, milliseconds, DateTimeKind.Utc);
return result;
}
catch
{
// If the date/time is invalid (e.g. month=13, day=32), we return null or handle differently
return null;
}
}
/// <summary>
/// Indicates whether the current object is equal to another object of the same type.
/// </summary>