Skip to content

Instantly share code, notes, and snippets.

@felixlindemann
Created February 25, 2016 21:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felixlindemann/a73c14d54aee600d662f to your computer and use it in GitHub Desktop.
Save felixlindemann/a73c14d54aee600d662f to your computer and use it in GitHub Desktop.
c# get Time from PTB Server
using System;
using System.Text;
using System.Net.Sockets;
public class clsTime
{
public static System.DateTime GetNISTTime()
{
// Variable für Fehlermeldungen
string errors = null;
// Array für die abzufragenden Server
string[] servers = {"ptbtime1.ptb.de","ptbtime2.ptb.de"};
// Schleife, in der die Server abgefragt werden, bis das Ergebnis
// in Ordnung ist
for (int i = 0; i < servers.Length; i++)
{
TcpClient tcpClient = null;
try
{
// TcpClient erzeugen und den Empfangs-Timeout auf eine Sekunde
// setzen
tcpClient = new TcpClient();
tcpClient.ReceiveTimeout = 1000;
// Versuch zum aktuellen Server eine Verbindung aufzubauen
tcpClient.Connect(servers[i], 13);
// Den NetworkStream referenzieren
NetworkStream networkStream = tcpClient.GetStream();
string result = null;
if (networkStream.CanWrite && networkStream.CanRead)
{
// Das Ergebnis empfangen und in ASCII konvertieren
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
try
{
networkStream.Read(bytes, 0,
(int)tcpClient.ReceiveBufferSize);
result = Encoding.ASCII.GetString(bytes);
}
catch (Exception ex)
{
// Fehler dokumentieren
if (errors != null) errors += "\r\n";
errors += "Fehler bei der Abfrage von '" + servers[i] +
": " + ex.Message;
}
}
if (result != null)
{
// Das Ergebnis, das die Form JJJJJ YR-MO-DA HH:MM:SS TT L H msADV
// UTC(NIST) OTM besitzt, in einzelne Token aufsplitten
string[] token = result.Split(' ');
// Anzahl der Token überprüfen
if (token.Length >= 6)
{
// Den Health-Status auslesen und überprüfen
string health = token[5];
if (health == "0")
{
// Alles ok: Datums- und Zeitangaben auslesen
string[] dates = token[1].Split('-');
string[] times = token[2].Split(':');
// DateTime-Instanz mit diesen Daten erzeugen
System.DateTime utcDate =
new System.DateTime(Int32.Parse(dates[0]) + 2000,
Int32.Parse(dates[1]), Int32.Parse(dates[2]),
Int32.Parse(times[0]), Int32.Parse(times[1]),
Int32.Parse(times[2]));
// Lokale Zeit berechnen und zurückgeben
return TimeZone.CurrentTimeZone.ToLocalTime(utcDate);
}
else
{
// Fehler dokumentieren
if (errors != null) errors += "\r\n";
errors += "Fehler bei der Abfrage von '" + servers[i] +
": Der Health-Status ist " + health;
}
}
else
{
// Fehler dokumentieren
if (errors != null) errors += "\r\n";
errors += "Fehler bei der Abfrage von '" + servers[i] +
": Die Anzahl der Token ist kleiner als 6";
}
}
}
catch (Exception ex)
{
// Fehler dokumentieren
if (errors != null) errors += "\r\n";
errors += "Fehler bei der Abfrage von '" +
servers[i] + ": " + ex.Message;
}
finally
{
try
{
// TcpClient schließen
tcpClient.Close();
}
catch { }
}
}
// Wenn die Methode hier ankommt, sind bei allen Abfragen
// Fehler aufgetreten, also eine Ausnahme werfen
throw new Exception(errors);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment