2017-05-22 1 views
0

Ich weiß, dass ich den folgenden Code verwenden, kann eine lange Daten zu übersetzen und seine Stunde Teil erhalten:Java erhalten Zeit Teile aus einer Lange Darstellung effizient

Calendar c = Calendar.getInstance(); 
c.setTimeInMillis(long-variable); 
c.get(Calendar.HOUR_OF_DAY); 

Aber das ist wirklich nicht effizient, und da dieser Code Läuft von mehreren Threads Kann ich nicht einfach das Calendar-Objekt wiederverwenden, gibt es eine effizientere Möglichkeit, den Stundenanteil von einer langen Darstellung eines Datums zu bekommen?

Danke!

+2

A 'long' Darstellung nicht über eine Zeitzone mit ihr verbundenen - Ein 'Kalender' tut es. Die 'lange' Darstellung ist * nur * ein Moment in der Zeit. Der aktuelle Zeitpunkt würde für mich in Großbritannien eine Stunde von 13 Stunden haben, aber es könnte woanders ganz für Sie sein ... für welche Zeitzone interessieren Sie sich? Ihr aktueller Code verwendet die Standardzeitzone des Systems. Sind Sie sicher, dass Sie das möchten? –

+1

'(longvar/1000/60/60)% 24'? Natürlich bekommst du die Stunde in GMT. – dejvuth

Antwort

0

Es geht nicht um Effizienz, es geht um Thread-Sicherheit. Die Kalenderklasse ist nicht threadsicher. Das bedeutet, dass das Ändern derselben Kalenderklasseninstanz über mehrere Threads zu unbestimmten Ergebnissen führen kann. Solange jeder Thread eine dedizierte Kalender-Instanz hat (die nicht mit anderen Threads geteilt wird), sollte alles in Ordnung sein.

Paar Worte über Thread-Sicherheit: http://www.javaworld.com/article/2076747/core-java/design-for-thread-safety.html

Über Kalender Klasse: https://stackoverflow.com/a/6245086/1529940

Sie können auch einen Blick in Joda-Time-Bibliothek oder eine neue Zeit API in Java8 haben wollen

1

LocalTime von java 8 verwenden

LocalTime time = Instant.ofEpochMilli(longValue) 
    .atZone(ZoneId.systemDefault()) 
    .toLocalTime(); 
System.out.println(time.getHour()); 
2

Die Calendar ist nicht Thread-sicher, so Calendar Instanz sollte, während mehrere thread.Of Kurs synchronisiert werden, mit ThreadLocal bei performance.Like das ist gut:

private ThreadLocal<Calendar> calendar=new ThreadLocal<Calendar>(){ 
    @Override 
    protected Calendar initialValue() { 
     return Calendar.getInstance(); 
    } 
}; 

public void foo(){ 
    Calendar c = calendar.get(); 
    c.setTimeInMillis(new Date().getTime()); 
    System.out.println(c.get(Calendar.HOUR_OF_DAY)); 
} 
Verwandte Themen