2016-11-28 1 views
1

Java SE 7および8 APIのDateTime関連クラスを使用して現在の時刻を表示するのに少し混乱しています。システムの現在の日時を取得するための複数の方法を検討しています。Javaの現在時刻apiの異なる値

私の質問はです:ミリ秒で表示するのが正確ですか?

次はコードスニペットです。私はJava 8を使用してレビューしています。

import java.time.Instant; 
import java.util.Calendar; 
import java.util.Date; 

public class CurrentTimeValidationDemo { 
    public static void main(String[] args) { 
     Instant now = Instant.now(); 
     Calendar calendar=Calendar.getInstance(); 
     Date currDate = new Date(); 
     System.out.println("new Date().getTime() = "+currDate.getTime()); 
     System.out.println("System.currentTimeMillis() = "+System.currentTimeMillis()); 
     System.out.println("Instant.now().toEpochMilli() = "+now.toEpochMilli()); 
     System.out.println("Calendar.getInstance().getTimeInMillis() = "+calendar.getTimeInMillis()); 
     System.out.println("Calendar.getInstance().getTime().getTime() = "+calendar.getTime().getTime()); 
    } 
} 
+3

「より正確に」を定義します。非常に関連しているhttp://stackoverflow.com/questions/368094/system-currenttimemillis-vs-new-date-vs-calendar-getinstance-gettime必ずしも同じものを印刷するとは限らないことに注意してください。Instant.nowは、マシンのタイムゾーンまたはDSTを考慮してください。 – Tunaki

+1

Java-9の高度な解像度については、私の[SO-post](http://stackoverflow.com/a/33478391/2491410)も参照してください。 –

+0

ナノ秒に若干の違いがあります。 – Jobin

答えて

1

例で使用したすべての関数は、(同じミリ秒で起動された場合)同じ値を返しますが、それらのいずれも正確ではありません。それらの一度

は、任意のオブジェクトを作成していないので、あなたは、あなたがいることを記憶しても同等のオブジェクトを持っている必要がある場合は、1970年1月1日に使用する代わりに

System.currentTimeMillis() 

ので、現在のミリ秒を知っている唯一の必要がある場合追加の操作で必要なオブジェクトを使用することができます。

たとえば、java.util.Dateを受け入れる関数にこの値を渡す必要がある場合は、java.util.Date(など)を使用します。

+3

@ Tunaki 'Instant.now()'という表現は、Java-8の 'System.currentTimeMillis()'に最後に委譲されています。ソースコードを調べてみてください。後者の表現でもDSTは使用されません。これは 'new Date()'の表現でも言えます。 –

+1

@Menoはい、あなたは正しいです。日付を直接印刷するのは混乱していたようです。 – Tunaki

+1

@Tunakiはい、 - 'java.util.Date'について - date.toString()'は非常に混乱する可能性があります。そのメソッド 'date.getTime()'を実際の状態を見るのがよいでしょう。 –

関連する問題