C#: Get NIST Internet Time

In one of the applications I have written I needed to get the current date to ensure that the user wasn’t using the software after their license expired. Given that using DateTime.Today could not be trusted as the user could just change their system date, I need ot retrieve the time from the internet somehow. Below is the code that I used to get the current date and time from various NIST Internet Time Services.

public static DateTime GetNISTDate(bool convertToLocalTime)
    Random ran = new Random(DateTime.Now.Millisecond);
    DateTime date = DateTime.Today;
  string serverResponse = string.Empty;

    // Represents the list of NIST servers
    string[] servers = new string[] {

    // Try each server in random order to avoid blocked requests due to too frequent request
  for (int i = 0; i < 5; i++)
  // Open a StreamReader to a random time server
  StreamReader reader = new StreamReader(new System.Net.Sockets.TcpClient(servers[ran.Next(0, servers.Length)], 13).GetStream());
  serverResponse = reader.ReadToEnd();

  // Check to see that the signiture is there
            if (serverResponse.Length > 47 && serverResponse.Substring(38, 9).Equals("UTC(NIST)"))
                // Parse the date
  int jd = int.Parse(serverResponse.Substring(1, 5));
                int yr = int.Parse(serverResponse.Substring(7, 2));
                int mo = int.Parse(serverResponse.Substring(10, 2));
                int dy = int.Parse(serverResponse.Substring(13, 2));
                int hr = int.Parse(serverResponse.Substring(16, 2));
                int mm = int.Parse(serverResponse.Substring(19, 2));
                int sc = int.Parse(serverResponse.Substring(22, 2));

  if (jd > 51544)
                    yr += 2000;
                    yr += 1999;

  date = new DateTime(yr, mo, dy, hr, mm, sc);

                // Convert it to the current timezone if desired
  if (convertToLocalTime)
                    date = date.ToLocalTime();

                // Exit the loop

        catch (Exception ex)
            /* Do Nothing...try the next server */

    return date;

There are quite a number of different NIST servers available but I have chosen eight here that have proved to give the quickest results (for me that is). A list of NIST Internet Time Servers can be found here along with their current status.

Posted in Time and Date. Tags: , , . 28 Comments »

Get every new post delivered to your Inbox.

Join 66 other followers