2016-11-19 3 views
0

Ich möchte Übertragungszeit von zwei Android-Handys in Client und Server mit Sockel messen, so dachte ich, der einfachste Weg,Aktuelle Android Zeit in Nanosekunde

System.NanoTime() 

Nach dem Senden von Client gestellt wird dann erhalten, nachdem sie von Server dann subtrahieren Sie sie, um die genaue Zeit zu erhalten. aber ich habe unterschiedliche Zeit auf jedem Telefon und wenn sie subtrahieren Ich habe seltsame lange Nummer (das erste kleine Telefon mit xxxxxx E12 und das andere Telefon xxxxxx E13 Nummer) so wie kann ich die Nummer in lesbarem Format, und Gibt es ein anderes Ergebnis, wenn ich andere Telefone verwende? danke

+0

Sie möchten den Zeitunterschied zwischen zwei Geräten in Nanosekunden messen? Ihre Daten werden * sehr * laut aufgrund der natürlichen [Uhrdrift] (https://en.wikipedia.org/wiki/Clock_drift) zwischen den Geräten. – Krease

+0

Das ist Mathematik .... Wenn Sie einen Wert wie E12 erhalten, bedeutet das, dass Sie den Punkt um 12 Positionen nach rechts setzen, um den Wert zu erhalten. Sie erhalten also die richtigen Werte, aber das Gerät konnte es nicht mit so vielen Zahlen anzeigen. Ich glaube nicht, dass es möglich ist, die gleichen Werte zu erhalten, indem man zum Server sendet und auswertet. In Nanosekunden ist zu viel Zeit zwischen diesen Schritten ... – Opiatefuchs

+2

Auch von [Javadoc auf NanoTime] (https://docs.oracle.com/javase/8/docs/api/java/lang/System.html # nanoTime--) - "Diese Methode kann nur verwendet werden, um die verstrichene Zeit zu messen und steht nicht im Zusammenhang mit irgendeiner anderen Vorstellung von System- oder Wanduhrzeit. Der zurückgegebene Wert repräsentiert Nanosekunden seit einer festen, aber beliebigen Ursprungszeit (vielleicht in der Zukunft, so dass die Werte negativ sein können. Der gleiche Ursprung wird von allen Aufrufen dieser Methode in einer Instanz einer Java Virtual Machine verwendet, andere Instanzen von virtuellen Maschinen verwenden wahrscheinlich einen anderen Ursprung. " - ** Sie können sie nicht über Geräte hinweg vergleichen ** – Krease

Antwort

1

Von dem, was ich verstehe, müssen Sie nur Übertragungszeit berechnen, die Zeit ist, die Anfrage-Antwort nehmen.

Also statt der Rückkehr nano, was können Sie tun currentTimeMillis() anruft, bevor die Verbindung hergestellt wird:

long sTime = System.currentTimeMillis(); 

Und dann, nachdem Sie eine Antwort Verwendung erhalten:

long fTime = System.currentTimeMillis(); 
long elapsedTime = fTime - sTime; 

wie kann Ich bekomme die Nummer im lesbaren Format?

DateFormat.getInstance().format(elapsedTime); 

Das Obige kann auf System.NanoTime() angewendet werden, ob Sie nano verwenden möchten oder Milli seine eine Frage der (Genauigkeit Vs. Leistung), wenn Sie eine extrem präzise Messungen und seine wichtiger als Leistung Sie wollen Dann benutze Nano.

Natürlich müssen Sie daran denken, dass elapsedTime von Zeit zu Zeit variieren wird, da es viel mehr als eine gute Implementierung gibt, also erwarten Sie nicht, dass es konstant ist.

Edit 1:

ich Dateformat mit Nanotime verwenden, weil ich sehr kleine Zeit brauchen, aber ich habe 1.1.1970 03.28 !! 10^-9 Sekunden würde alles was ich brauche ist wie (123455 Nanosekunde Zeit Sende)

Und das ist, warum ich System.currentTimeMillis in meinem Beispiel als Nanozeitform, verwendet haben, eine größere Granularität zu bekommen System.currentTimeMillis() verwenden, oder Sie

TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS); 

Wenn Sie nicht wollen, TimeUnit verwenden nur die Nummer teilen, die Sie von 1000000000 bekommen: mit einfach nano Sekunden konvertieren.

+0

Ich benutze DateFormat mit NanoTime, weil ich sehr kleine Zeit brauche, aber ich habe 1/1/1970 3:28 Uhr !! Alles was ich brauche ist wie (123455 Nanosekunden Zeit übertragen) –