Zeit von einem Zeitserver beziehen?

Status
Nicht offen für weitere Antworten.
Hallo zusammen!

Kann mir jemand sagen, wie ich mit Java über irgendeinen frei zugänglichen Zeitserver an eine möglichst genaue Uhrzeit komme? Ich benötige diese, um den genauen Zeitpunkt zu bestimmen, in dem ein Benutzer einen Button anklickt. Der zu erwartende Fehler gegenüber einer frisch synchronisierten Funkuhr sollte dabei maximal +/- 1/2 Sekunde betragen.

Und was würdet ihr dann als weiteres Vorgehen vorschlagen? Als Reaktion auf den Klick kann ich ja aus offensichtlichen Gründen nicht die Zeit erst über's Netz abfragen, also brauche ich wohl so etwas wie meinen eigenen Uhr-Thread? (Ich nehme nicht an, dass es möglich ist, per Java die Systemzeit neu zu setzen? Das wäre natürlich die ideale Lösung.)

Gibt es eine fertige Lösung, z. B. in Form einer Bibliothek, die ich einbinden könnte?

Beste Grüße

equest
 

fjord

Bekanntes Mitglied
Ich habe es selber noch nicht genutzt, aber was ich jetzt mal so auf die Schnelle gefunden habe ist http://commons.apache.org/net/. Das unterstützt das Network Time Protocol. Server dafür findest du zum Beispiel bei der Physikalisch-Technischen Bundesanstalt.

Mein Vorgehen wäre zu Beginn des Programms die Abweichung der lokalen Uhr vom Zeitserver zu bestimmen und dann beim Klick einfach die lokale Uhr unter Berücksichtigung der Abweichung zu verwenden. Das die lokale Uhr sich während dein Programm läuft um 1/2 Sekunde verstellt ist eigentlich nicht zu erwarten.
 

ARadauer

Top Contributor
die frage ist halt jetzt nur, wie du die systemzeit ändern kannst.
ich denke du willst dir die arbeit mit jni oder jna ersparen...
auf einem windows system würde es so funktionieren...

[HIGHLIGHT="Java"]import java.awt.AWTException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Test {

public static void main(String[] args) throws FileNotFoundException, IOException, AWTException {
System.out.println("start");
GregorianCalendar cal = new GregorianCalendar();
cal.add(Calendar.HOUR, 1);

DateFormat f = new SimpleDateFormat("HH:mm:ss");
System.out.println("Stelle Zeit auf "+f.format(cal.getTime()));


Process p = Runtime.getRuntime().exec("cmd /c time "+f.format(cal.getTime()));
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line =null;
while((line=r.readLine())!=null){
System.out.println(line);
}
System.out.println("fertig");
}


}[/HIGHLIGHT]
das stellt die zeit um eine stunde nach vor
 
Zuletzt bearbeitet von einem Moderator:
Danke schön auch dir, ARadauer. Ich werde die Systemzeit aber nicht verstellen, wenn ich dadurch einen Teil Plattformunabhängig verliere. Ansonsten habe ich jetzt eine funktionierende Lösung gefunden, die zentrale Hilfsklasse habe ich angefügt.

Die kleine, aber feine Bibliothek, die alle meine Probleme gelöst hat, heißt AtomicDate und ist hier verfügbar: http://atomicdate.sourceforge.net. Manchmal kann es so einfach sein, wenn man das richtige Stichwort (in diesem Fall SNTP) bekommt.

[HIGHLIGHT="Java"]/**
* Provides methods to retrieve current network time and local time offset.
*
* @param haddr The time server host address.
*/
class AtomicTime{

/**
* The default time server.
*/
private String haddr = "ptbtime1.ptb.de";

/**
* Default value for the number of attempts to be made to retrieve the network time offset.
*/
private int attempts = 3;

/**
* The error message that will be returned if network time or offset can't be retrieved.
*/
private String errorMessage;

/**
* Default format for times.
*/
final static public SimpleDateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss.SSS");

/**
* Default format for date and time.
*/
final static public SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("z yyyy-MM-dd HH:mm:ss.SSS");

/**
* @param haddr The time server host address.
*/
public AtomicTime(String haddr){
this.haddr = haddr;
this.errorMessage = "Can't receive current time from + " + haddr + ".";
}

/**
* Uses the default time server.
*/
public AtomicTime(){
this.errorMessage = "Can't receive current time from + " + haddr + ".";
}

/**
* @return The local time offset relative to the network time, or Long.MIN_VALUE if it couldn't be retrieved.
*
* @param n The number of attempts to be made to retrieve the network time offset.
*/
public long getOffset(int n){
long offset = Long.MIN_VALUE;

net.sf.atomicdate.Client client = null;
try{
client = new net.sf.atomicdate.Client(1000);
}
catch(java.net.SocketException e){
System.out.println(errorMessage);
// e.printStackTrace();
}

if(client != null){
long[] offsets = new long[n];
boolean[] success = new boolean[n]; for(int i=0; i<n; i++){ success = true; }
int cnt = 0;

for(int i=0; i<n; i++){ // n attempts
try{
offsets = client.getOffset(haddr); // retrieve the network time offset from the specified SNTP server
// System.out.println("" + i + ": " + offsets);
}
catch(IOException e){
success = false;
cnt++;
// e.printStackTrace();
}
}

int validOffsets = n - cnt;
if(validOffsets > 0){
offset = 0;
for(int i=0; i<n; i++){
if(success){
// System.out.println("" + i + ": " + offsets);
offset += offsets;
}
}
// System.out.println("" + offset + ", " + validOffsets + ", " + ((double)offset/validOffsets));
offset = Math.round((double)offset/validOffsets);
}
else{ System.out.println(errorMessage); }

client.stopListening();
}

return offset;
}

/**
* @return The local time offset relative to the network time, or Long.MIN_VALUE if it couldn't be retrieved.
*/
public long getOffset(){
return getOffset(attempts);
}

/**
* @return The current network time, or null if it couldn't be retrieved.
*
* @param n The maximum number of attempts to be made to retrieve network time.
*/
public Date getNetworkTime(int n){
net.sf.atomicdate.Date date = null;
int count = 0;

while(date == null && count < n){ // n attempts
try{
date = new net.sf.atomicdate.Date(haddr);
// System.out.println(dateTimeFormat.format(date));
count++;
}
catch(IOException ioe){
// ioe.printStackTrace();
}
}
if(date == null){ System.out.println(errorMessage); }

return date;
}
}[/HIGHLIGHT]
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dann07 Audio streamen bricht immer ab nach kurzer Zeit Netzwerkprogrammierung 6
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
D Zeit über time.nist.gov:13 erfragen Netzwerkprogrammierung 3
P Zeit zwischen mehreren Client log-ins bestimmen. Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
J client server mit nur einem PC Netzwerkprogrammierung 33
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S FTP Verbindung zu einem BS2000 Großrechner mit Commons Net Netzwerkprogrammierung 0
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
M allgemeine Frage zu einem Web Service Client Netzwerkprogrammierung 2
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
E Verbindung zu SQL-Datenbank auf einem Server Netzwerkprogrammierung 13
B Grundlegende Fragen zu einem Verbindungsaufbau in einem LAN Netzwerkprogrammierung 15
Rudolf Socket An welchen Port sendet ein Mailserver zu einem anderen Mailserver Netzwerkprogrammierung 8
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
R Threads mit einem WebService Netzwerkprogrammierung 4
N Java NIO eingehende und ausgehende Verbindungen mit einem Selector Netzwerkprogrammierung 12
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
D Socket Automatischer Reconnect nach einem Disconnect. Netzwerkprogrammierung 4
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
P Wie gibt man einem GUI Programm ein Web interface? Netzwerkprogrammierung 5
D "FileChooser" auf einem Webserver Netzwerkprogrammierung 5
D Verbindung zu einem Server - POST Netzwerkprogrammierung 2
J Mit Java Anwendung ein (externes) Programm auf einem AIX Rechner starten Netzwerkprogrammierung 6
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
H Mit Java ein JPG auf einem Server öffnen. Netzwerkprogrammierung 7
U problem mit verbindung zu einem irc server Netzwerkprogrammierung 3
D Multicast geht nur auf einem Rechner Netzwerkprogrammierung 9
A Java-Programm auf einem Server laufen lassen Netzwerkprogrammierung 9
E upload progress bei einem http file post Netzwerkprogrammierung 5
C Verbindung zum Server prüfen mit einem vorhandenem Socket Netzwerkprogrammierung 4
S RMI server in einem Mehrbenutzer-System mit Auth? Netzwerkprogrammierung 10
D Verbindung über ein Servlet zu einem Server Netzwerkprogrammierung 4
B Im eingelesenen Text nach einem Wort suchen Netzwerkprogrammierung 46
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
G Anzahl verbundener Clients zu einem FTP-Server ermitteln? Netzwerkprogrammierung 4
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
V Kann keine DatagramPackets versenden von einem Jar Archiv Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
V Zuweisen einer InetAddress mit einem byte Netzwerkprogrammierung 5
J Webserver auf einem Pocket PC Netzwerkprogrammierung 2
S Dateien auf einem HTTP Server Netzwerkprogrammierung 2
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
C Login bei einem php-script Netzwerkprogrammierung 2
B HEX String zu einem Byte Array ? *verzweiflung* :( Netzwerkprogrammierung 16
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
O Dateien von einem Server laden Netzwerkprogrammierung 3
T Datei, auf einem Netzwerkrechner speichern. Netzwerkprogrammierung 11
S MySQL, PHP, Perl Support in einem Java HTTP Server? Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben