2017-05-22 5 views
0

は、私が長いデータに変換し、その時間の一部を取得するには、次のコードを使用することができます知っている:Javaの取得時間の部品を効率的

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

をしかし、これは本当に効率的ではありませんが、このコードからCalendarオブジェクトを再利用することができない複数のスレッドから実行されます。日付の長い表現から時間部分を取得する効率的な方法はありますか?

ありがとうございます!

+2

'long'表現、それに関連付けられたタイムゾーンを持っていません:はスレッドセーフではないので、Calendarインスタンスが複数thread.Ofコースながら、同期する必要があり、ThreadLocalを使用すると、これはperformance.Likeで良いです - 'カレンダー'は行います。 「長い」表現は、ただの瞬間である。現在の瞬間は、英国では私にとって13時の1日を持ちますが、それはあなたのために完全にどこかにあるかもしれません...どのタイムゾーンに興味がありますか?現在のコードでは、システムのデフォルトのタイムゾーンが使用されています。 –

+1

'(longvar/1000/60/60)%24'?もちろん、GMTで時間を取得します。 – dejvuth

答えて

0

スレッドの安全性については効率的ではありません。 Calendarクラスはスレッドセーフではありません。つまり、複数のスレッド間で同じCalendarクラスインスタンスを変更すると、結果が不確定になる可能性があります。すべてのスレッドが(他のスレッドと共有されていない)専用のCalendarインスタンスを持っている限り、すべてが正常でなければなりません。スレッドの安全性についての言葉の

カップル:Calendarクラスについて http://www.javaworld.com/article/2076747/core-java/design-for-thread-safety.html

https://stackoverflow.com/a/6245086/1529940

あなたはまた、Java8

1

にジョダタイムライブラリに見たり、新しい時間のAPIを持っている場合がありますjava 8のLocalTimeを使用

LocalTime time = Instant.ofEpochMilli(longValue) 
    .atZone(ZoneId.systemDefault()) 
    .toLocalTime(); 
System.out.println(time.getHour()); 
2
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)); 
} 
関連する問題