diff --git a/src/NmeaParser/Nmea/Glonass/Glzda.cs b/src/NmeaParser/Nmea/Glonass/Glzda.cs
new file mode 100644
index 0000000..c0cb0fd
--- /dev/null
+++ b/src/NmeaParser/Nmea/Glonass/Glzda.cs
@@ -0,0 +1,8 @@
+namespace NmeaParser.Nmea.Glonass
+{
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Glzda")]
+ [NmeaMessageType("GLZDA")]
+ public class Glzda : Zda
+ {
+ }
+}
diff --git a/src/NmeaParser/Nmea/Gnss/Gnzda.cs b/src/NmeaParser/Nmea/Gnss/Gnzda.cs
new file mode 100644
index 0000000..00e96eb
--- /dev/null
+++ b/src/NmeaParser/Nmea/Gnss/Gnzda.cs
@@ -0,0 +1,8 @@
+namespace NmeaParser.Nmea.Gnss
+{
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gnzda")]
+ [NmeaMessageType("GNZDA")]
+ public class Gnzda : Zda
+ {
+ }
+}
diff --git a/src/NmeaParser/Nmea/Gps/GPZDA.cs b/src/NmeaParser/Nmea/Gps/GPZDA.cs
new file mode 100644
index 0000000..6ca6949
--- /dev/null
+++ b/src/NmeaParser/Nmea/Gps/GPZDA.cs
@@ -0,0 +1,8 @@
+namespace NmeaParser.Nmea.Gps
+{
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Gpzda")]
+ [NmeaMessageType("GPZDA")]
+ public class Gpzda : Zda
+ {
+ }
+}
diff --git a/src/NmeaParser/Nmea/Zda.cs b/src/NmeaParser/Nmea/Zda.cs
new file mode 100644
index 0000000..7d2b851
--- /dev/null
+++ b/src/NmeaParser/Nmea/Zda.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Globalization;
+
+namespace NmeaParser.Nmea
+{
+ ///
+ /// Date and time of fix
+ ///
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Zda")]
+ public abstract class Zda : NmeaMessage
+ {
+ ///
+ /// Called when the message is being loaded.
+ ///
+ /// The NMEA message values.
+ protected override void OnLoadMessage(string[] message)
+ {
+ if (message?.Length != 6)
+ {
+ throw new ArgumentException("Invalid GNGST", nameof(message));
+ }
+
+ var time = StringToTimeSpan(message[0]);
+ var day = int.Parse(message[1], CultureInfo.InvariantCulture);
+ var month = int.Parse(message[2], CultureInfo.InvariantCulture);
+ var year = int.Parse(message[3], CultureInfo.InvariantCulture);
+
+ FixDateTime = new DateTime(year, month, day, time.Hours, time.Minutes,
+ time.Seconds, DateTimeKind.Utc);
+
+ // Index 4 and 5 is used to specify a local time zone.
+ // However I haven't come across any receiver that actually
+ // specify this, so we're just ignoring it.
+ }
+
+ public DateTime FixDateTime { get; private set; }
+ }
+}
diff --git a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs
index ef6da1e..23a375d 100644
--- a/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs
+++ b/src/UnitTests/NmeaParser.Tests/NmeaMessages.cs
@@ -614,5 +614,35 @@ namespace NmeaParser.Tests
Assert.AreEqual(0.0, vtg.SpeedInKnots);
Assert.AreEqual(0.0, vtg.SpeedInKph);
}
+
+ [TestMethod]
+ public void TestGnzda()
+ {
+ var input = "$GNZDA,075451.00,02,10,2018,00,00*72";
+ var msg = NmeaMessage.Parse(input);
+ Assert.IsInstanceOfType(msg, typeof(Gnzda));
+ var zda = (Gnzda)msg;
+ Assert.AreEqual(new DateTime(2018, 10, 02, 07, 54, 51, 00, DateTimeKind.Utc), zda.FixDateTime);
+ }
+
+ [TestMethod]
+ public void TestGpzda()
+ {
+ var input = "$GPZDA,143042.00,25,08,2005,,*6E";
+ var msg = NmeaMessage.Parse(input);
+ Assert.IsInstanceOfType(msg, typeof(Gpzda));
+ var zda = (Gpzda)msg;
+ Assert.AreEqual(new DateTime(2005, 08, 25, 14, 30, 42, 00, DateTimeKind.Utc), zda.FixDateTime);
+ }
+
+ [TestMethod]
+ public void TestGlzda()
+ {
+ var input = "$GLZDA,225627.00,21,09,2015,00,00*70";
+ var msg = NmeaMessage.Parse(input);
+ Assert.IsInstanceOfType(msg, typeof(Glzda));
+ var zda = (Glzda)msg;
+ Assert.AreEqual(new DateTime(2015, 09, 21, 22, 56, 27, 00, DateTimeKind.Utc), zda.FixDateTime);
+ }
}
}