Rubrik: Datum/Zeit und Timer · Datums- und Zeit-Funktionen | VB-Versionen: VB.NET | 12.11.07 |
Aktuelle Atomzeit ermitteln (VB 2005) Mit dieser Funktion lässt sich die sekundengenaue Atomzeit über einen beliebigen Zeitserver im Internet ermitteln. | ||
Autor: Dieter Otter | Bewertung: | Views: 23.573 |
www.tools4vb.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Nachfolgender Tipp zeigt, wie sich unter VB 2005 die Atomzeit über das Internet auslesen und die aktuelle Systemzeit entsprechend der Atomzeit aktualisieren lässt.
Alles, was Sie hierzu brauchen, ist die Adresse eines Time-Servers, sowie die System.Net.Sockets-Klasse. Als Time-Server nehmen wir in unserem Beispiel time-a.nist.gov. Die Atomzeit wird hierbei in folgendem Format übermittelt: xxxxx yy-mm-dd hh:mm:ss xx x x xx.x UTC(NIST) *. Man braucht dann lediglich das Datum und die Uhrzeit zu extrahieren und die Zeit-Differenz zur GMT-Zeit addieren (Sommer-/Winterzeit).
Imports System.Net.Sockets Imports System.Text
Private Function AtomicTime(ByVal sTimeServer As String) As Date ' Standard-Rückgabewert bei Fehler Dim vDate As Date = Nothing Try ' Verbindung zum TimerServer herstellen Dim oClient As TcpClient = New TcpClient() oClient.Connect(sTimeServer, 13) ' NetworkStream-Objekt für die Antwort Dim oStream As NetworkStream = oClient.GetStream() ' Antwort des TimeServer lesen Dim cCh1 As Char Dim sResponse As New StringBuilder Dim nByte As Integer ' solange byteweise einlesen, bis keine ' Daten mehr vom Server zurückkommen Do nByte = oStream.ReadByte() If nByte = -1 Then Exit Do cCh1 = System.Convert.ToChar(nByte) sResponse.Append(cCh1.ToString) Loop Until nByte = 13 ' Verbindung trennen oClient.Close() If sResponse.Length > 0 Then Dim sBuffer As String = sResponse.ToString ' Atomzeiten werden in folgendem Format übermitteln: ' xxxxx yy-mm-dd hh:mm:ss xx x x xx.x UTC(NIST) * ' Datum und Uhrzeit aus dem Rückgabestring des ' TimeServers extahieren If sBuffer.Contains(" ") Then Dim sData() As String = sBuffer.Split(" ") If sData(1).Length = 8 AndAlso sData(2).Length = 8 Then ' Datumsangabe in Einzelteile splitten Dim sDate() As String = Split(sData(1), "-") ' Uhrzeitangabe in Einzelteile splitten Dim sTime() As String = Split(sData(2), ":") ' einzelne Datumswerte und Uhrzeitwerte zu neuem ' Date-Objekt zusammenstellen vDate = New DateTime(2000 + CInt(sDate(0)), _ CInt(sDate(1)), CInt(sDate(2)), _ CInt(sTime(0)), CInt(sTime(1)), CInt(sTime(2))) ' jetzt noch ggf. Sommer/Winterzeit berücksichtigen Dim nDif As Integer = Val(Now.ToString("zzzz").Substring(0, 3)) If nDif <> 0 Then vDate = vDate.AddHours(nDif) End If End If End If End If Catch ex As Exception vDate = Nothing End Try Return vDate End Function
Die Funktion gibt im Erfolgsfall die ermittelte Atomzeit zurück. Sollte der Time-Server nicht erreichbar sein oder ein anderweitiger Fehler auftreten, wird "Nothing" zurückgegeben.
Aufrufbeispiel:
Dim vDate As Date = AtomicTime("time-a.nist.gov") If Not vDate = Nothing Then MsgBox("Die aktuelle Atomzeit ist: " & vDate) ' Systemzeit mit Atomzeit aktualisieren Microsoft.VisualBasic.DateString = vDate.ToString("MM-dd-yyyy") Microsoft.VisualBasic.TimeString = vDate.ToString("HH:mm:ss") Else MsgBox("Atomzeit konnte nicht ermittelt werden!") End If