2016-03-23 1 views
2

In meinem Java (eigentlich Android, aber es ist irrelevant hier) Projekt, kann der Benutzer Start-und Endzeit für einige Aktivität eingeben und das System berechnet automatisch die Dauer. Beim Drücken der Taste verwende ich System.currentTimeMillis(), um den aktuellen Zeitstempel zu erhalten.Erhalten pure Zeit Element von langen Zeitstempel

Aus Gründen außerhalb des Bereichs dieser Frage muss ich den Datumsteil des Zeitstempels verwerfen und nur die Zeit eins speichern. Leicht, dachte ich, teilen nur durch die Anzahl der Millisekunden an einem Tag und nehmen den Rest:

long currentTimestamp = System.currentTimeMillis(); 
long timeOnly = currentTimeStamp % (1000 * 60 * 60 * 24); 

Diese fast Werke - außer es Zeitstempel um eine Stunde erzeugt. Hier ein Beispiel:

DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US); 
long currentTimestamp = System.currentTimeMillis(); 
long timeOnly = currentTimestamp % (1000 * 60 * 60 * 24); 
System.out.println("Full value: " + timeFormat.format(currentTimestamp)); 
System.out.println("Time only: " + timeFormat.format(timeOnly)); 

Dieser Code druckt:

Full value: 10:53 PM 
Time only: 11:53 PM 


Full value: 11:19 PM 
Time only: 12:19 AM 

Während ich nur eine Stunde von dem Zeitstempel subtrahieren kann, möchte ich den Grund eigentlich verstehen, warum dies geschieht.

+0

Ich bin mir nicht sicher ... aber meine Intuition sagt mir, dass es etwas mit Zeitzonen zu tun hat. Lass mich das überprüfen - wir sind gerade in DTS ... das würde die Stunde erklären :). Ihr currentTimeMillis ist ein UNIX-Zeitstempel (in UTC würde Ihre Berechnung funktionieren ...). Ich bin wieder da :) – Philipp

+0

Es lohnt sich, darauf hinzuweisen, dass ich selbst in Großbritannien bin und wir noch nicht in der Sommerzeit sind. Ich bekomme genau das gleiche Ergebnis, wenn ich 'Locale.UK' verwende. –

+0

addiere' timeFormat.setTimeZone (TimeZone.getTimeZone ("UTC")); 'und du wirst den Unterschied nicht haben ... es ist sicher ein Zeitzonenproblem :). Das 'Locale' dient nur der Formatierung, nicht der Zeitzone. – Philipp

Antwort

0

Versuchen:

Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(new Date(System.currentTimeMillis())); 
    calendar.set(Calendar.MONTH, 0); 
    calendar.set(Calendar.YEAR, 0); 
    calendar.set(Calendar.DAY_OF_MONTH, 0); 

    System.out.println("Full value: " + timeFormat.format(currentTimestamp)); 
    System.out.println("Time only: " + timeFormat.format(calendar.getTimeInMillis())); 

Die Calendar Instanz Ihrer aktuellen Timezone und alle Setter nehmen die Änderung der Zeitzone in Betracht verwenden. Also sollte es funktionieren.

Hinweis:

Es bleibt die Frage, warum Sie das tun wollen. Möchten Sie nur Zeitinformationen in einer Datenbank speichern, anstatt das vollständige Datum zu speichern? Wenn Sie das tun möchten, können Sie Ihre aktuelle Locale-Zeit zu einer UTC-Zeit zuordnen (anstatt currentTimeMillis() zu verwenden).

+0

Ok, Datum auf 0/0/0 eingestellt. Der Grund für das Entfernen des Datumsteils liegt darin, wie die ausgewählte Zeit geändert werden kann. Die Benutzeroberfläche, die für die Änderung der Uhrzeit verwendet wird, zeigt nur die Uhrzeit an, aktualisiert sie jedoch mit dem Datum/der Uhrzeit des Aktualisierungsdatums. Wenn es an einem anderen Datum aktualisiert wird, dann werde ich statt 1 Stunde Intervall 1 Tag plus 1 Stunde bekommen - deshalb muss ich alles auf den gleichen Tag normalisieren. Am einfachsten ist es, das Datum einfach zu entfernen. –

+0

Ich denke, Sie sollten mit der 'Kalender' Implementierung arbeiten und wenn Sie Java8 benutzen, schauen Sie sich http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html und http an : //stackoverflow.com/questions/29750221/is-joda-time-deprecated-with-java-8-date-and-time-api-java-time – Philipp

+0

Nun, Java 8 ist keine Option, wie ich bin Schreiben speziell für Android 4.2.2-Geräte (internes Client-Nachlass) –