Datum & Zeit aus Webseiten

Zeit-Synchronisation mit Webseiten

Die Zeit-Synchronisation von Servern und PC erfolgt normalerweise mit dem NTP oder SNTP-Protokoll. Unter besnsonderen Umständen kann man auch Webseiten und Webserver dazu verwenden. Das wird auf dieser Seite demonstriert.
NTP Zeit-Synchronisation mit dem Network Time Protocol (NTP)
Live-Demo Webseiten mit der aktuellen Zeit
Webseiten Wozu Webseiten Zeit-Synchronisation ?
Probleme Grundsätzliches: Firewall, Browser, eigene Programme
Test Manueller Test: Änderung der PC-Zeit, Verbindung zum Zeit-Server
Socket Anforderung einer Webseite
Verwandte Themen: Datum & Zeit in der Informatik, Datum & Zeit auf Linux und Windows, Zeit-Synchronisation auf Linux und Windows

Live-Text mit der aktuellen Zeit

Zeitzonen:
Weltzeit UTC
Mitteleuropäische Zeit CET
WET   EET
Formate:
ISO-8601-formatierte Daten
UNIX Timestamp
Y1900 Datum & Zeit
Linux SystemBefehl
Windows SystemBefehl
Astronomie:
JD   OZ   ST
  (Standort = Wien)
Im Rahmen rechts wird ein Text angezeigt, der soeben Live vom Webserver erzeugt wurde. Der Server verwendet dazu ein kleines Programm in der Programmiersprache PHP.
(Für den technisch rückständigen M$IE Browser muss eine Webseite erzeugt werden).
Seite in einem eigenen Fenster laden: CET, Linux, Windows, Hilfe
Details zu Datum & Zeit @ PHP

Webseiten zur Zeit-Synchronisation

Damit keine Missverständnisse aufkommen:
Unter normalen Umständen ist die Zeit-Synchronisation mit dem → NTP- oder → SNTP-Protokoll zu bevorzugen. Das erfordert keine zusätzlichen Maßnahmen und ist in der System-Software aller modernen PC enthalten.
Durch übertriebene Sicherheits-Maßnahmen wird dieser Weg jedoch in immer mehr Netzwerken versperrt. In solchen Fällen kann man die Zeit auch aus normalen Webseiten beziehen, die von jedem Router und Firewall durchgelassen werden.

Zeit aus dem Inhalt von Webseiten

Unzählige Webseiten enthalten in ihrem Text die aktuelle Zeit. Oft kann man zwischen Weltzeit UTC und Lokalzeit (mit Sommerzeit) wählen.

Man kann den Text mit einem Programm ( → Perl, → PHP, Python, ...) auswerten, daraus die Zeit isolieren und damit einen PC synchronisieren.

Zeit aus dem HTTP-Header

Jeder (!) Webseite geht ein kurzer Text-Block voraus, der vom Browser nicht angezeigt wird. Für diese Methode kann man sogar nicht existierende Webseiten anfordern, denn auch Fehler-Meldungen enthalten im → HTTP-Header die Zeit des Servers.

Man kann den → HTTP-Header mit einem Programm (Java, → Perl, → PHP, Python, ...) auswerten, daraus die Zeit isolieren und damit einen PC synchronisieren.

Zeit vom eigenen Webserver

Jeder Standard Webserver kann seine Zeit in einem beliebig bequemen Format liefern. Dazu eignet sich vor allem der eigene Webserver (im LAN), aber auch der Server des Web-Providers.

In diesem Fall braucht man eigene Programme sowohl am Server als auch auf jedem PC. Beide Programme sind jedoch wesentlich einfacher zu erstellen.

Live Beispiel

Die im Rahmen ↑ Live angezeigte Seite ist ein Beispiel für eine Webseite, welche die aktuelle Zeit enthält und jeden normalen Firewall problemlos passiert.

Die Zeit-Seite ist besonders Auswertungs-freundlich ausgelegt: Es ist sehr einfach, den Text mit eigenen Programmen auszuwerten. Damit das Demo-Beispiel nicht kommerziell ausgebeutet wird, ist der Zugriff begrenzt.

Grundsätzliche Probleme

Firewall

Alle modernen PC sind mit Firewalls ausgestattet. Diese Programme kontrollieren die ein- und ausgehenden Daten-Pakete. Ein Firewall kümmert sich nicht um den Inhalt (wie ein Anti-Viren-Programm) sondern nur um Sockets, d.h. um → IP-Adressen und → Ports.

Zur Verwendung der Standard Synchronisations Software muss ein Firewall sowohl die IP-Adresse des gewünschten Zeit-Servers zulassen als auch den Port für zumindest eines der rechts angeführten Protokolle:
Jede Standard Synchronisation funktioniert mit → NTP bzw. → SNTP. Damit sollte auch der eigene Server (als Zeit-Client = Kunde eines internationalen Zeit-Servers) synchronisiert werden.
Für → DayTime oder → Time kann man zwar optional TCP oder UDP verwenden, diese Protokolle werden von öffentlichen Servern jedoch nur mehr selten angeboten. Für einen eigenen Server (d.h. zur Versorgung der eigenen PC mit Zeit) sind diese beiden Protokolle jedoch interessant: Wesentlich einfacher, ohne lange Verhandlungen sofort verfügbar.

ProtokollPort
NTPUDP123
SNTPUDP123
DayTimeUDP/TCP13
TimeUDP/TCP37
HTTP*TCP80

→ HTTP ist kein Protokoll zur Zeit-Synchronisation, sondern für normale Webseiten. Jeder Firewall erlaubt die Kommunkation auf diesem Port, sonst kann man auch keine Webseiten ansehen.
Genau deshalb kann man dieses Protokoll verwenden, wenn ein Firewall die Standard-Ports der Zeit-Synchronisation blockiert. Auf dieser Seite finden sie Hinweise, wie das gemacht wird.

Details zu IP-Adresse, Port, TCP, UDP, HTTP

Browser

Es hört sich einfach an, die PC-Zeit mit Hilfe einer Webseite zu synchronisieren. Dazu kann man jedoch leider keinen Browser verwenden:
Browser und Webseiten dürfen aus gutem Grund prinzipiell nicht auf die Resourcen des eigenen PC zugreifen. Das bedeutet: Jeder Browser kann die Zeit zwar lesen, darf jedoch die System-Zeit seines PC nicht ändern.

ActiveX

Der IT-Marktführer hat sich nicht an diese Vereinbarung gehalten und für seinen Internet Explorer die Verwendung von ActiveX Zusatz-Programmen eingerichtet, welche auch Zugriff auf den eigenen PC haben können.
Allerdings hat sich rasch gezeigt dass damit dem Missbrauch Tür & Tor geöffnet werden. Die aktuellen M$IE-Versionen erlauben zwar noch ActiveX Programme, man muss sich dazu jedoch durch viele Menüs, Dialoge und Schalter wühlen.
Das macht niemand, deshalb funktioniert heute die strenge Sicherheits-Schranke zwischen Browser und PC wieder weitgehend.

Eigene Programme

Da ein Browser keinen Zugriff auf die Resourcen des eigenen PC hat, muss man zur Zeit-Synchronisation ein Programm mit folgenden Eigenschaften verwenden:

Das Programm muss Webseiten (mit der aktuellen Zeit) anfordern können. Kapitel ↓ Socket dieser Seite.
Das Programm muss aus den eintreffenden Webseiten die aktuelle Zeit entnehmen.
Das Programm muss die System-Zeit des PC entsprechend einstellen und sollte darüber auch ein Log führen.

Diese Arbeiten können in jeder modernen Programmiersprache ausgeführt werden. Der Aufwand ist für AnfängerInnen zu groß, aber für etwas Fortgeschrittene kein Problem.
Tipp: Verwenden sie vorzugsweise Java, → Perl, → PHP oder Python.

Eine wesentliche Hürde sind die Zugriffs-Rechte auf den eigenen PC: Wer selbst kein Recht hat, die PC-Zeit manuell einzustellen, der kann dazu auch kein Programm verwenden.

Manueller Test

Wenn sie ein Programm zur Zeit-Synchronisation einsetzen oder entwickeln wollen, dann ist es sehr empfehlenswert, die notwendigen Voraussetzungen vorher manuell zu kontrollieren. Dieses Kapitel zeigt, wie man 2 Vor-Bedingungen manuell testen kann:
Einstellung der PC-Uhr
Verbindung zum Zeit-Server bzw. Web-Server - Ohne Behinderung durch einen Firewall.

Einstellung der PC-Uhr:

Vergessen sie nicht, nach dem Test die PC-Zeit wieder korrekt einzustellen. Nur dann, wenn sie die PC-Zeit manuell ändern dürfen, können sie ein Synchronisations-Programm einsetzen. Andernfalls verfügen sie nicht über die benötigten Administrations-Rechte.

Linux:

Melden sie sich als Administrator root an. Öffnen sie eine Shell-Konsole und geben sie diese Befehle ein:
# date "+%T"
hh:mi:ss
# date --set=12:00
# date "+%T"
12:00:10
# date --set=hh:mi
# date "+%T"
hh:mi:ss

Details zu Datum und Zeit auf Linux

Windows:

Öffnen sie ein Konsolen-Fenster (Programm cmd.exe ) und geben sie diese Befehle ein:. Damit wird die PC-Zeit geändert und danach wieder korrekt eingestellt:
C:\> time
Aktuelle Zeit: hh:mi:ss,cc
Geben sie die neue Zeit ein: 12:00

C:\> time
Aktuelle Zeit: 12:00:10,00
Geben sie die neue Zeit ein: hh:mi

C:\> time /T
hh:mi

Details zu Datum und Zeit auf Windows

Verbindung mit einem Zeit-Server

telnet
Die vorgestellte Methode verwendet das Standard Konsolen-Programm telnet, das in jedem ernstzunehmenden Betriebssystem enthalten ist. Manche Varianten von Vista enthalten kaum noch nützliche Bestandteile und haben auch telnet bereits eingespart. In diesem Fall kann man (vorläufig noch ?) telnet.exe von einem anderen Windows System kopieren.

Zeit-Server
Wählen sie einen oder mehrere Zeit-Server, von denen sie die Zeit zur Synchronisation beziehen wollen.
Der Test mit telnet funktioniert nur mit den Protokollen → Time oder → DayTime, nicht mit → NTP oder SNTP. Erste Priorität hat ein eigener Zeit-Server in ihrem lokalen Netzwerk (LAN).
→ Beispiele für → Zeit-Server in Mitteleuropa (A,CH,D).

Der Test ist für die Beispiele dieser Seite nicht notwendig. Er wird hier angeführt, weil man damit testen kann, ob ein Firewall Verbindungen auf den Zeitserver-Ports 13 oder 37 erlaubt.
Öffnen sie eine Konsole ( → Linux-Shell oder Windows → cmd.exe) und starten sie telnet:
# telnet 131.30.1.12 13
# telnet 131.30.1.12 37
Ersetzen sie die IP-Adresse des Beispiels durch die ihres Zeit-Servers.
Port 13 (erste Zeile) bezeichnet das DayTime-Protokoll: Der Server antwortet mit einem Text (String).
Port 37 (zweite Zeile) bezeichnet das Time Protokoll:
Der Server antwortet mit 4 Binär-Bytes, die man zumindest erkennen, wenn auch nicht interpretieren kann.
Wenn der Server nicht antwortet, schreibt telnet nach einiger Zeit eine Fehlermeldung.

Zeit-Text mit Browser

Wenn ihr Server oder der Server ihres Providers einen Zeit-Text wie im Beispiel oben oder eine dynamische Webseite mit der aktuellen Zeit anbietet, dann sollte dieses Angebot sowohl mit jedem Browser als auch mit telnet angezeigt werden.
Beispiel mit Browser: Diese Variante verbindet über Port 80 und umgeht dadurch die häufigsten Firewall-Schranken.

Zeit-Text mit telnet

Dieses Konsolen-Programm ist zwar etwas mühsam zu bedienen, zeigt jedoch die Details der Verbindung besser als ein Browser:
# telnet www.topsoft.at 80
GET /pstrainer/time.php / HTTP
Nach Eingabe der ersten Zeile wird das Konsolen-Fenster gelöscht, und sie müssen die 2. Zeile "blind" eingeben.
Nach der 2. Zeile klicken sie 2mal (!!) die Eingabe-(return)-Taste.

Da ein Firewall nicht zwischen Browser und Telnet unterscheiden kann, sollte er die Verbindung erlauben.
Ausnahmen sind manche Firewall-ähnlichen Produkte, die (nur am eigenen PC) auch das Programm kontrollieren: In diesem Fall erlauben sie für Telnet die gleichen Rechte wie für jeden anderen Browser.

Wenn sie ein eigenes Programm zur Zeit-Synchronisation auf Port 80 einsetzen wollen, dann muss es genauso arbeiten wie telnet im manuellen Beispiel:
Zuerst wird die (Socket)-Verbindung mit Angabe von Adresse und Port=80 hergestellt.
Nach Aufbau der Verbindung wird mit einem HTTP-Request Befehl (GET...) das gewünschte Produkt vom Server angefgordert - In diesem Fall der Zeit-Text.
Der Server sendet als Antwort einen HTTP-Header (HTTP 200 OK...) und danach den Zeit-Text.
Ihr Programm muss daraus die Zeit entnehmen und die System-Zeit ihres PC einstellen.

Beachten Sie: Im HTTP-Header jeder Webserver-Antwort ist die Zeit enthalten. Auch diese Information kann von eigenen Programmen genutzt werden.

Aufbau einer Verbindung (Socket)
Anforderung einer Web-Datei

Socket

Ein eigenes Programm muss zunächst die (TCP)-Verbindung mit dem gewünschten Webserver herstellen. Die Kombination aus IP-Adresse und Port wird als Socket bezeichnet.
Mit Stichwort socket (kombiniert mit Perl, PHP, Python, ...) finden sie im Internet zahlreiche Hinweise zur Programmierung.

Proxy / Router

Wenn ihr PC nicht direkt, sondern über einen Router (Proxy-Server) mit dem Internet verbunden ist, dann muss das im Programm berücksichtigt werden, - Ebenso wie jeder Browser den Weg ins Internet kennen muss.
Konkret wird dazu IP-Adresse und Port des Routers benötigt.
Der Router wird nicht gebraucht, wenn sie mit dem eigenen Webserver (im lokalen Netzwerk) verbinden wollen.

Kleine Web-Dateien !

Die Beispiele gehen davon aus, dass nur sehr kleine Dateien vom Webserver angefordert werden, z.B. kleine Webseiten oder der hier verwendete Zeit-Text.
Der gesamte vom Webserver gesendete Text wird in einem einzigen Befehl gelesen und in einer Variablen $content gespeichert.

Wenn die Methode auf größere Daten-Mengen angewendet werden soll, dann wird in einer Schleife jeweils eine kleine Portion der Daten gelesen und verarbeitet.
Das ist allerdings für den Zweck der Zeit-Synchronisation nicht sinnvoll. - Dafür fordert man am besten ganz kurze Dateien an, so wie hier demonstriert.

Socket mit Perl

Dieses Mini-Programm stellt den Socket her, fordert eine Webseite (hier den Zeit-Text) an und gibt den Text (im Konsolen-Fenster) aus.
Auf Windows vertauschen sie die beiden ersten Zeilen.
Alle benötigten Funktionen sind im Modul LWP enthalten (Mehrere andere Module sind möglich).
Die Variable $content enthält den gesamten Quelltext der angeforderten Webseite (hier den Zeit-Text).
#!/usr/bin/perl
#!c:\programme\perl\bin\perl.exe
use LWP::UserAgent;
use LWP::Simple;
my $brs = LWP::UserAgent->new;
my $url = 'http://www.topsoft.at/time.php';
my $content = get $url;
print $content;

Socket mit Perl (über Router)

Wenn der Weg ins Internet über einen Router (Proxy-Server) führt, dann ersetzen sie die beiden letzten Zeilen des oben angeführten Beispiels durch das rechts gezeigte Programm:
Ersetzen sie Adresse und Port (hier 192.168.0.1:2345) durch die Daten ihres Routers.

my $proxy='http://192.168.0.1:2345/'; $brs->proxy(http => $proxy);
my $req = HTTP::Request->new(GET => $url);
my $content = $brs->request($req)->as_string;
print $content;

Socket mit PHP

Alle benötigten Funktionen sind im Modul standard enthalten und brauchen daher nicht geladen zu werden.
$url = "http://www.topsoft.at/time.php";
$fp = @fopen($url,"r");
$content = fread($fp,1000);
print $content;
fclose($fp);
 
$url = "http://www.topsoft.at/time.php";
$proxy_ip = '192.168.0.1';
$proxy_port = 2345;
$fp = fsockopen($proxy_ip,$proxy_port);
if ($fp ) {
fputs ($fp,"GET $url HTTP\r\n\r\n:
$content = fread($fp,1000);
fclose ($fp );

Zeit aus Webseiten

Diese Möglichkeit ist wenig bekannt, aber sehr einfach und vor allem auch in streng geschützten Netzwerken ('paranoid' konfigurierter Firewall) immer anwendbar. Leider scheint keines der gängigen Freeware Programme diese Möglichkeit zu nutzen. Die Programmierung ist jedoch für EntwicklerInnen kein Problem.

Prinzip:

Im → HTTP-Header jeder Webseite ist die aktuelle Zeit enthalten.
Um sie zu erhalten, genügt es, eine beliebige Webseite von einem WebServer anzufordern.
Ideal sind sehr kleine Webseiten, winzige Bilder oder einfache Texte. Die angeforderte Seite muss nicht einmal existieren, denn auch jede vom Server gelieferte Fehler-Seite enthält die Zeit im HTTP-Header.
Vor der Anwendung testet man am besten einige Server in naher Umgebung und wählt dann einen mit zuverlässiger Systemzeit.
Jede moderne Programmiersprache kann eine HTTP-Anforderung an einen Webserver senden und den HTTP-Header aus dessen Antwort auswerten.

Wer keinen HTTP-Header auswerten will oder kann, hat noch die Möglichkeit, den Inhalt einer der zahllosen Webseiten auszuwerten, welche die aktuelle Zeit im Internet anbieten.
Das ist nicht ganz im Sinne des Anbieters, der meist von der ebenfalls enthaltenen Werbung lebt. Daher sollten sie allfällige Nutzungs-Bedingungen lesen.

In jedem Fall können sie nur mit entsprechender Berechtigung die Systemzeit ihres PC ändern. (Administrator, root)

NTP oder HTTP ?

Wenn es die Konfiguration aller beteiligten Router, Proxy-Server und Firewalls erlaubt, dann sollte man unbedingt NTP (notfalls auch Daytime oder Time ↑ ) zur Zeit-Synchronisation verwenden.

In einigen Fällen werden NTP-Daten jedoch blockiert, z.B.
Der Router oder Proxy-Server gibt Daten-Pakete (Ports 123, 13 ,37) dieser Dienste nicht weiter.
Ein Firewall (am eigenen PC oder am Router-PC) blockiert die betreffenden Ports.
Wenn möglich, wird die Konfiguration von Router / Firewall so gändert, dass zumindest der NTP-Port 123 durchgelassen wird.

Wenn das nicht möglich ist (Router-PC nicht zugänglich, keine Berechtigung), dann kann die Zeit des HTTP-Headers ausgewertet werden.
Der HTTP-Port 80 wird von jedem Router weitergeleitet und normalerweise auch vom Firewall nicht gesperrt (sonst kann man nicht einmal Webseiten anfordern).
Zur Zeit-Synchronisation jedes PC sind normalerweise Administrator-Rechte notwendig. Stellen sie (z.B. durch manuelle Änderung der Zeit) sicher, dass sie über derartige Rechte verfügen.

Zahllose Webseiten enthalten das aktuelle Datum und die aktuelle Zeit.
Mit geeigneten Programmen (z.B. → Perl, → PHP, ..) kann man diese Daten lesen und die Systemzeit danach setzen.

Das funktioniert auch dann, wenn ihnen durch einen Proxy-(Firewall)-Server der NTP-Zugriff über UDP-Port 123 nicht möglich ist.

Programmierung

Jede moderne Programmiersprache bietet die Möglichkeit zur Auswertung der von einem Webserver gelieferten Zeit-Daten. Einige Beispiele:

Socket - Herstellung einer Verbindung (→ TCP oder → UDP + Port 80) zu einem Webserver

HTTP-Header lesen

HTML-Inhalt von Webseiten lesen

System-Befehl zur Änderung der PC System-Zeit absetzen:
Perl, PHP, VBA

Zugriffsrechte:
Zum Setzen der Systemzeit muss man über die entsprechenden Zugriffsrechte verfügen. Ein Webserver sollte diese Rechte keinesfalls haben. Daher können Webseiten nicht zur Synchronisation der Systemzeit verwendet werden.
Eine 'illegale' Ausnahme - allerdings nur für M$-Systeme - könnten sie mit ActiveX machen.
Verwenden sie vorzugsweise 'Standalone'-Scripts, die auf der → Konsole (Linux-Shell, cmd.exe, ...) gestartet werden. Es macht Sinn, solche Scripts Zeit-gesteuert auszulösen.

Details zur Zeit-Steuerung in Linux oder Windows).
Zeit-Text:
Einige Webseiten bieten die aktuelle Zeit im Standard Text-Format hh:mi:ss, das sich (mit einem → Regulären Ausdruck) leicht isolieren lässt.
Solche Webseiten werden zwar live erzeugt, verhalten sich aber danach meist statisch, d.h. die eingetragene Zeit ändert sich nicht mehr. Wenn sich der Zeit-Text Live ändert, dann erfolgt das mit JavaScript, die geänderte (aktuelle) Zeit ist jedoch nicht im HTML-Quelltext enthalten !
Timestamp:
Viele Webseiten bieten automatische Aktualisierung der aktuellen Zeit. Das wird mit unterschiedlichen → Javascript-Methoden erreicht. In diesen Fällen finden sie die aktuelle Zeit meist als → Timestamp (Zeit seit 1970.01.01 in ms) in einem <script>-Block.
(→ Umrechnung verschiedener Zeit-Variablen)
HTTP-Header:
Diese Variante ist besonders einfach zu programmieren, jedoch wenig bekannt:
Alle Webserver senden vor dem HTML-Code jeder (!) Webseite einen HTTP-Header mit einigen Informationen, darunter auch der aktuellen (Server)-Zeit als Weltzeit UTC.
Diese Daten werden von Browsern nicht angezeigt, können jedoch von jedem (z.B. selbst erstellten Perl-) Programm verwendet werden.
Eigene Programme unterliegen nicht den Zugriffs-Beschränkungen eines Webservers und können problemlos mit dem Recht ausgestattet werden, die Systemzeit zu verändern.
Die Zeit ist bei guten Servern (vor allem denjenigen der → nationalen Zeit-Institute) sehr zuverlässig. Wählen sie rasch ladende Webseiten aus (→ Rahmen-Seiten sind meist schön kurz), damit lassen sich PC gut und rasch synchronisieren.
Details zum HTTP-Header
Webseiten mit der aktuellen Zeit Links:
Hier ist die Zeit im Standard-Format hh:mi:ss enthalten:
NIST (UTC, CET, CEST), USNO (UTC), TimeAndDate (UTC, CET), Uni Köln (CET), NRC (UTC), Mubo, Laokoon, ...

Hier ist die Zeit als 'h,m,s' in Javascript enthalten:
Weltzeituhr (UTC)

Hier ist die Zeit als Javascript-Timestamp enthalten:
GreenwichMeanTime (UTC, CET), Uhrzeit, Uni Köln, ...

Leider seit vielen Monaten außer Betrieb: BEV (at)

XHTML CSS