none
Internet-Uhrzeit Auslesen RRS feed

  • Frage

  • Hallo Leute,

    Weiß einer wie man aus dem Internet leicht die Uhrzeit und das Datum auslesen kann (nicht ins System übernehmen, nur auslesen)

    Danke im Voraus


    Ich arbeite mit Visual Basic 2010 Express
    Donnerstag, 1. September 2011 16:31

Antworten

  • Hallo Niklas,

    schau Dir mal an http://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-from-c

    Dort wird auf einen NtpClient (in C#) verwiesen, der nur einige Zeilen lang ist.
    Solltest Du Probleme haben, ihn auf Visual Basic zu übertragen, sag Bescheid.

    Gruß Elmar

    Donnerstag, 1. September 2011 17:02
    Beantworter
  • Hallo Niklas,

    eine VB Portierung aus dem obigen Link mit einigen kleineren Anpassungen,
    um äquivalent zu DateTime sowohl UTC wie lokale Zeit ermitteln zu können:

    Option Strict On
    Option Infer On
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    
    Namespace ElmarBoye.Samples.Code
        ''' <summary>
        ''' Einfache statische Klasse zum Empfangen der Zeit von einem NTP Server.
        ''' </summary>
        ''' <remarks>
        ''' Siehe http://www.faqs.org/rfcs/rfc2030.html
        ''' </remarks>
        Public Module NtpTime
            ' Basiert auf http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#GawBxmf1je8/NTP/NtpClient.cs&q=ntp%20lang:c%23&l=34
            ' ergänzt um UTC / lokale Zeit, .NET 3.5 +
    
            ''' <summary>Standard NTP Server via <i>de.pool.ntp.org</i></summary>
            ''' <remarks>
            ''' Siehe http://www.pool.ntp.org/de/ und http://www.pool.ntp.org/de/use.html
            ''' </remarks>
            Public ReadOnly DEFAULT_NTP_SERVER As String = "de.pool.ntp.org"
    
            ''' <summary>Liefert die lokale Zeit vom Standard-Server.</summary>
            Public Function GetNetworkTimeLocal() As DateTime
                Return GetNetworkTimeLocal(DEFAULT_NTP_SERVER)
            End Function
    
            ''' <summary>Liefert die lokale Zeit von einen NTP-Server.</summary>
            Public Function GetNetworkTimeLocal(ntpServer As String) As DateTime
                Dim networkTime = GetNetworkTimeUtc(ntpServer)
                networkTime = networkTime.ToLocalTime()
                Return networkTime
            End Function
    
            ''' <summary>Liefert die UTC Zeit vom Standard-Server.</summary>
            Public Function GetNetworkTimeUtc() As DateTime
                Return GetNetworkTimeUtc(DEFAULT_NTP_SERVER)
            End Function
    
            ''' <summary>
            ''' Liefert die UTC Zeit von dem Zeitserver <paramref name="ntpServer"/>.
            ''' </summary>
            ''' <param name="ntpServer">Der Hostname des NTP Servers.</param>
            ''' <returns>Eine <see cref="DateTime"/> als UTC Zeit.</returns>
            Public Function GetNetworkTimeUtc(ntpServer As String) As DateTime
                Dim timeSpan = GetNetworkTimeStamp(ntpServer)
                Dim networkTime As DateTime = NTP_DATETIME.Add(timeSpan)
                Return networkTime
            End Function
    
            Private ReadOnly NTP_DATETIME As New DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            Const NTP_PORT As Integer = 123
            Const NTP_PAKETSIZE As Integer = 48
            Const NTP_TRANSMIT_TS_OFFSET As Integer = 40
    
            ''' <summary>Liefert den aktuellen Timestamp.</summary>
            Private Function GetNetworkTimeStamp(ntpServer As String) As TimeSpan
                If String.IsNullOrEmpty(ntpServer) Then
                    Throw New ArgumentNullException("ntpServer")
                End If
    
                Dim addressList = Dns.GetHostEntry(ntpServer).AddressList
                If addressList Is Nothing OrElse addressList.Length = 0 Then
                    Throw New ArgumentException("Could not resolve ip address.", "ntpServer")
                End If
    
                ' RFC 2030
                Dim ntpData = New Byte(NTP_PAKETSIZE - 1) {}
                ntpData(0) = &H1B
                Array.Clear(ntpData, 1, NTP_PAKETSIZE - 1)
    
                Dim endPoint As New IPEndPoint(addressList(0), NTP_PORT)
                Using socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
                    socket.Connect(endPoint)
                    socket.Send(ntpData)
                    socket.Receive(ntpData)
                End Using
    
                ' Sekunden und Teile davon
                Dim seconds As Long = 0
                Dim fractions As Long = 0
                For i As Integer = 0 To 3
                    seconds = (seconds << 8) + ntpData(NTP_TRANSMIT_TS_OFFSET + i)
                    fractions = (fractions << 8) + ntpData(NTP_TRANSMIT_TS_OFFSET + 4 + i)
                Next
    
                Dim milliseconds As Long = (seconds * 1000L) + (fractions * 1000L \ &H100000000L)
                Dim networkTime = TimeSpan.FromTicks(milliseconds * TimeSpan.TicksPerMillisecond)
                Return networkTime
            End Function
        End Module
    End Namespace
    
    Verwenden dann als:

            Dim timeUtc = NtpTime.GetNetworkTimeUtc()
            Dim timeLocal = NtpTime.GetNetworkTimeLocal()
            Console.WriteLine("NTP Zeit: {0} UTC, {1} lokal", timeUtc, timeLocal)
    
    

    Wobei man sich bei Windows XP und später i. a. auf die Windows Zeit verlassen kann,
    wenn sie über NTP synchronisiert wird, siehe http://support.microsoft.com/kb/314054

    Gruß Elmar


    • Bearbeitet Elmar BoyeEditor Mittwoch, 14. September 2011 15:52 Format
    • Als Antwort markiert Niklas R Samstag, 17. September 2011 17:58
    Mittwoch, 14. September 2011 15:45
    Beantworter
  • und für jene, die es in C# haben wollen:

    using System;
    using System.Net;
    using System.Net.Sockets;
    
    namespace ElmarBoye.Samples.Code
    {
        /// <summary>
        /// Einfache statische Klasse zum Empfangen der Zeit von einem NTP Server.
        /// </summary>
        /// <remarks>
        /// Siehe http://www.faqs.org/rfcs/rfc2030.html
        /// </remarks>
        public static class NtpTime
        {
            // Basiert auf http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#GawBxmf1je8/NTP/NtpClient.cs&q=ntp%20lang:c%23&l=34
            // ergänzt um UTC / lokale Zeit, .NET 3.5 +
    
            /// <summary>Standard NTP Server via <i>de.pool.ntp.org</i></summary>
            /// <remarks>
            /// Siehe http://www.pool.ntp.org/de/ und http://www.pool.ntp.org/de/use.html
            /// </remarks>
            public static readonly string DEFAULT_NTP_SERVER = "de.pool.ntp.org";
    
            /// <summary>Liefert die lokale Zeit vom Standard-Server.</summary>
            public static DateTime GetNetworkTimeLocal()
            {
                return GetNetworkTimeLocal(DEFAULT_NTP_SERVER);
            }
    
            /// <summary>Liefert die lokale Zeit von einen NTP-Server.</summary>
            public static DateTime GetNetworkTimeLocal(string ntpServer)
            {
                var networkTime = GetNetworkTimeUtc(ntpServer);
                networkTime = networkTime.ToLocalTime();
                return networkTime;
            }
    
            /// <summary>Liefert die UTC Zeit vom Standard-Server.</summary>
            public static DateTime GetNetworkTimeUtc()
            {
                return GetNetworkTimeUtc(DEFAULT_NTP_SERVER);
            }
    
            /// <summary>
            /// Liefert die UTC Zeit von dem Zeitserver <paramref name="ntpServer"/>.
            /// </summary>
            /// <param name="ntpServer">Der Hostname des NTP Servers.</param>
            /// <returns>Eine <see cref="DateTime"/> als UTC Zeit.</returns>
            public static DateTime GetNetworkTimeUtc(string ntpServer)
            {
                var timeSpan = GetNetworkTimeStamp(ntpServer);
                DateTime networkTime = NTP_DATETIME.Add(timeSpan);
                return networkTime;
            }
    
            private static readonly DateTime NTP_DATETIME = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            const int NTP_PORT = 123;
            const int NTP_PAKETSIZE = 48;
            const int NTP_TRANSMIT_TS_OFFSET = 40;
    
            /// <summary>Liefert den aktuellen Timestamp.</summary>
            private static TimeSpan GetNetworkTimeStamp(string ntpServer)
            {
                if (string.IsNullOrEmpty(ntpServer))
                    throw new ArgumentNullException("ntpServer");
    
                var addressList = Dns.GetHostEntry(ntpServer).AddressList;
                if (addressList == null || addressList.Length == 0)
                    throw new ArgumentException("Could not resolve ip address.", "ntpServer");
    
                // RFC 2030
                byte[] ntpData = new byte[NTP_PAKETSIZE];
                ntpData[0] = 0x1B;
                Array.Clear(ntpData, 1, NTP_PAKETSIZE - 1);
    
                IPEndPoint endPoint = new IPEndPoint(addressList[0], NTP_PORT);
                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    socket.Connect(endPoint);
                    socket.Send(ntpData);
                    socket.Receive(ntpData);
                }
    
                // Sekunden und Teile davon
                long seconds = 0;
                long fractions = 0;
                for (int i = 0; i < 4; i++)
                {
                    seconds = (seconds << 8) + ntpData[NTP_TRANSMIT_TS_OFFSET + i];
                    fractions = (fractions << 8) + ntpData[NTP_TRANSMIT_TS_OFFSET + 4 + i];
                }
    
                long milliseconds = (seconds * 1000L) + (fractions * 1000L / 0x100000000L);
                TimeSpan networkTime = TimeSpan.FromTicks(milliseconds * TimeSpan.TicksPerMillisecond);
                return networkTime;
            }
        }
    }
    

    Und verwenden als:

     

        var timeUtc = NtpTime.GetNetworkTimeUtc();
        var timeLocal = NtpTime.GetNetworkTimeLocal();
        Console.WriteLine("NTP Zeit: {0} UTC, {1} lokal", timeUtc, timeLocal);
    

    Gruß Elmar

     

    • Bearbeitet Elmar BoyeEditor Mittwoch, 14. September 2011 15:57 Format
    • Als Antwort markiert Niklas R Samstag, 17. September 2011 17:58
    Mittwoch, 14. September 2011 15:46
    Beantworter

Alle Antworten

  • Hallo Leute,

    Weiß einer wie man aus dem Internet leicht die Uhrzeit und das Datum auslesen kann (nicht ins System übernehmen, nur auslesen)

    Danke im Voraus


    Ich arbeite mit Visual Basic 2010 Express
    Donnerstag, 1. September 2011 16:32
  • Hallo Niklas,

    schau Dir mal an http://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-from-c

    Dort wird auf einen NtpClient (in C#) verwiesen, der nur einige Zeilen lang ist.
    Solltest Du Probleme haben, ihn auf Visual Basic zu übertragen, sag Bescheid.

    Gruß Elmar

    Donnerstag, 1. September 2011 17:02
    Beantworter
  • Hallo Niklas R,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Donnerstag, 8. September 2011 06:31
    Moderator
  • Kannst du mir vieleicht einen Visual Basic Code geben den ich bei mir übertragen kann und dann zwei Strings oder dates mit dem Datum und der Uhrzeit aus dem Internet kriege?

    Danke


    Ich arbeite mit Visual Basic 2010 Express
    Dienstag, 13. September 2011 17:24
  • Hallo Niklas,

    schau mal hier:

      http://converter.telerik.com/

    Der Konverter ist eigentlich für solch kleine Codeausschnitte gut verwendbar.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 13. September 2011 17:57
    Moderator
  • Hallo Niklas R,

    Ergänzend zu dem Beitrag von Stefan, hier kannst Du eine Liste mit dem Vergleich zwischen mehreren Converter finden.

    How does Code Converter compare?

    Grüße,

    Robert

    Mittwoch, 14. September 2011 07:13
    Moderator
  • Hallo Niklas,

    eine VB Portierung aus dem obigen Link mit einigen kleineren Anpassungen,
    um äquivalent zu DateTime sowohl UTC wie lokale Zeit ermitteln zu können:

    Option Strict On
    Option Infer On
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    
    Namespace ElmarBoye.Samples.Code
        ''' <summary>
        ''' Einfache statische Klasse zum Empfangen der Zeit von einem NTP Server.
        ''' </summary>
        ''' <remarks>
        ''' Siehe http://www.faqs.org/rfcs/rfc2030.html
        ''' </remarks>
        Public Module NtpTime
            ' Basiert auf http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#GawBxmf1je8/NTP/NtpClient.cs&q=ntp%20lang:c%23&l=34
            ' ergänzt um UTC / lokale Zeit, .NET 3.5 +
    
            ''' <summary>Standard NTP Server via <i>de.pool.ntp.org</i></summary>
            ''' <remarks>
            ''' Siehe http://www.pool.ntp.org/de/ und http://www.pool.ntp.org/de/use.html
            ''' </remarks>
            Public ReadOnly DEFAULT_NTP_SERVER As String = "de.pool.ntp.org"
    
            ''' <summary>Liefert die lokale Zeit vom Standard-Server.</summary>
            Public Function GetNetworkTimeLocal() As DateTime
                Return GetNetworkTimeLocal(DEFAULT_NTP_SERVER)
            End Function
    
            ''' <summary>Liefert die lokale Zeit von einen NTP-Server.</summary>
            Public Function GetNetworkTimeLocal(ntpServer As String) As DateTime
                Dim networkTime = GetNetworkTimeUtc(ntpServer)
                networkTime = networkTime.ToLocalTime()
                Return networkTime
            End Function
    
            ''' <summary>Liefert die UTC Zeit vom Standard-Server.</summary>
            Public Function GetNetworkTimeUtc() As DateTime
                Return GetNetworkTimeUtc(DEFAULT_NTP_SERVER)
            End Function
    
            ''' <summary>
            ''' Liefert die UTC Zeit von dem Zeitserver <paramref name="ntpServer"/>.
            ''' </summary>
            ''' <param name="ntpServer">Der Hostname des NTP Servers.</param>
            ''' <returns>Eine <see cref="DateTime"/> als UTC Zeit.</returns>
            Public Function GetNetworkTimeUtc(ntpServer As String) As DateTime
                Dim timeSpan = GetNetworkTimeStamp(ntpServer)
                Dim networkTime As DateTime = NTP_DATETIME.Add(timeSpan)
                Return networkTime
            End Function
    
            Private ReadOnly NTP_DATETIME As New DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            Const NTP_PORT As Integer = 123
            Const NTP_PAKETSIZE As Integer = 48
            Const NTP_TRANSMIT_TS_OFFSET As Integer = 40
    
            ''' <summary>Liefert den aktuellen Timestamp.</summary>
            Private Function GetNetworkTimeStamp(ntpServer As String) As TimeSpan
                If String.IsNullOrEmpty(ntpServer) Then
                    Throw New ArgumentNullException("ntpServer")
                End If
    
                Dim addressList = Dns.GetHostEntry(ntpServer).AddressList
                If addressList Is Nothing OrElse addressList.Length = 0 Then
                    Throw New ArgumentException("Could not resolve ip address.", "ntpServer")
                End If
    
                ' RFC 2030
                Dim ntpData = New Byte(NTP_PAKETSIZE - 1) {}
                ntpData(0) = &H1B
                Array.Clear(ntpData, 1, NTP_PAKETSIZE - 1)
    
                Dim endPoint As New IPEndPoint(addressList(0), NTP_PORT)
                Using socket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
                    socket.Connect(endPoint)
                    socket.Send(ntpData)
                    socket.Receive(ntpData)
                End Using
    
                ' Sekunden und Teile davon
                Dim seconds As Long = 0
                Dim fractions As Long = 0
                For i As Integer = 0 To 3
                    seconds = (seconds << 8) + ntpData(NTP_TRANSMIT_TS_OFFSET + i)
                    fractions = (fractions << 8) + ntpData(NTP_TRANSMIT_TS_OFFSET + 4 + i)
                Next
    
                Dim milliseconds As Long = (seconds * 1000L) + (fractions * 1000L \ &H100000000L)
                Dim networkTime = TimeSpan.FromTicks(milliseconds * TimeSpan.TicksPerMillisecond)
                Return networkTime
            End Function
        End Module
    End Namespace
    
    Verwenden dann als:

            Dim timeUtc = NtpTime.GetNetworkTimeUtc()
            Dim timeLocal = NtpTime.GetNetworkTimeLocal()
            Console.WriteLine("NTP Zeit: {0} UTC, {1} lokal", timeUtc, timeLocal)
    
    

    Wobei man sich bei Windows XP und später i. a. auf die Windows Zeit verlassen kann,
    wenn sie über NTP synchronisiert wird, siehe http://support.microsoft.com/kb/314054

    Gruß Elmar


    • Bearbeitet Elmar BoyeEditor Mittwoch, 14. September 2011 15:52 Format
    • Als Antwort markiert Niklas R Samstag, 17. September 2011 17:58
    Mittwoch, 14. September 2011 15:45
    Beantworter
  • und für jene, die es in C# haben wollen:

    using System;
    using System.Net;
    using System.Net.Sockets;
    
    namespace ElmarBoye.Samples.Code
    {
        /// <summary>
        /// Einfache statische Klasse zum Empfangen der Zeit von einem NTP Server.
        /// </summary>
        /// <remarks>
        /// Siehe http://www.faqs.org/rfcs/rfc2030.html
        /// </remarks>
        public static class NtpTime
        {
            // Basiert auf http://www.google.com/codesearch/p?hl=en&sa=N&cd=1&ct=rc#GawBxmf1je8/NTP/NtpClient.cs&q=ntp%20lang:c%23&l=34
            // ergänzt um UTC / lokale Zeit, .NET 3.5 +
    
            /// <summary>Standard NTP Server via <i>de.pool.ntp.org</i></summary>
            /// <remarks>
            /// Siehe http://www.pool.ntp.org/de/ und http://www.pool.ntp.org/de/use.html
            /// </remarks>
            public static readonly string DEFAULT_NTP_SERVER = "de.pool.ntp.org";
    
            /// <summary>Liefert die lokale Zeit vom Standard-Server.</summary>
            public static DateTime GetNetworkTimeLocal()
            {
                return GetNetworkTimeLocal(DEFAULT_NTP_SERVER);
            }
    
            /// <summary>Liefert die lokale Zeit von einen NTP-Server.</summary>
            public static DateTime GetNetworkTimeLocal(string ntpServer)
            {
                var networkTime = GetNetworkTimeUtc(ntpServer);
                networkTime = networkTime.ToLocalTime();
                return networkTime;
            }
    
            /// <summary>Liefert die UTC Zeit vom Standard-Server.</summary>
            public static DateTime GetNetworkTimeUtc()
            {
                return GetNetworkTimeUtc(DEFAULT_NTP_SERVER);
            }
    
            /// <summary>
            /// Liefert die UTC Zeit von dem Zeitserver <paramref name="ntpServer"/>.
            /// </summary>
            /// <param name="ntpServer">Der Hostname des NTP Servers.</param>
            /// <returns>Eine <see cref="DateTime"/> als UTC Zeit.</returns>
            public static DateTime GetNetworkTimeUtc(string ntpServer)
            {
                var timeSpan = GetNetworkTimeStamp(ntpServer);
                DateTime networkTime = NTP_DATETIME.Add(timeSpan);
                return networkTime;
            }
    
            private static readonly DateTime NTP_DATETIME = new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            const int NTP_PORT = 123;
            const int NTP_PAKETSIZE = 48;
            const int NTP_TRANSMIT_TS_OFFSET = 40;
    
            /// <summary>Liefert den aktuellen Timestamp.</summary>
            private static TimeSpan GetNetworkTimeStamp(string ntpServer)
            {
                if (string.IsNullOrEmpty(ntpServer))
                    throw new ArgumentNullException("ntpServer");
    
                var addressList = Dns.GetHostEntry(ntpServer).AddressList;
                if (addressList == null || addressList.Length == 0)
                    throw new ArgumentException("Could not resolve ip address.", "ntpServer");
    
                // RFC 2030
                byte[] ntpData = new byte[NTP_PAKETSIZE];
                ntpData[0] = 0x1B;
                Array.Clear(ntpData, 1, NTP_PAKETSIZE - 1);
    
                IPEndPoint endPoint = new IPEndPoint(addressList[0], NTP_PORT);
                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    socket.Connect(endPoint);
                    socket.Send(ntpData);
                    socket.Receive(ntpData);
                }
    
                // Sekunden und Teile davon
                long seconds = 0;
                long fractions = 0;
                for (int i = 0; i < 4; i++)
                {
                    seconds = (seconds << 8) + ntpData[NTP_TRANSMIT_TS_OFFSET + i];
                    fractions = (fractions << 8) + ntpData[NTP_TRANSMIT_TS_OFFSET + 4 + i];
                }
    
                long milliseconds = (seconds * 1000L) + (fractions * 1000L / 0x100000000L);
                TimeSpan networkTime = TimeSpan.FromTicks(milliseconds * TimeSpan.TicksPerMillisecond);
                return networkTime;
            }
        }
    }
    

    Und verwenden als:

     

        var timeUtc = NtpTime.GetNetworkTimeUtc();
        var timeLocal = NtpTime.GetNetworkTimeLocal();
        Console.WriteLine("NTP Zeit: {0} UTC, {1} lokal", timeUtc, timeLocal);
    

    Gruß Elmar

     

    • Bearbeitet Elmar BoyeEditor Mittwoch, 14. September 2011 15:57 Format
    • Als Antwort markiert Niklas R Samstag, 17. September 2011 17:58
    Mittwoch, 14. September 2011 15:46
    Beantworter
  • Danke für die Antworten!

    Es hat geklappt


    Ich arbeite mit Visual Basic 2010 Express
    • Bearbeitet Niklas R Samstag, 17. September 2011 17:58
    Samstag, 17. September 2011 17:58