Java 8の新しいLocalDate
クラス、LocalTime
クラス、またはLocalDateTime
クラスを使用して、1 - 1970年(エポック)から現在のミリ秒を取得する方法があるかどうか私は疑問に思います。
既知の方法は以下のとおりです。
long currentMilliseconds = new Date().getTime();
または
long currentMilliseconds = System.currentTimeMillis();
「現在のミリ秒」が何を意味するのか完全にはわかりませんが、「Epoch」からのミリ秒数、つまり1970年1月1日午前0時UTCと仮定します。
Epoch からのミリ秒数を今すぐ探したい場合は、 を Anubian Noobが指摘した としてSystem.currentTimeMillis()
を使用してください。もしそうなら、これを行うために新しいJava.time APIのいずれかを使用する理由はありません。
しかし、多分あなたはすでにどこかにLocalDateTime
やそれに似たオブジェクトを持っていて、それをエポックからのミリ秒に変換したいと思うでしょう。 LocalDateTime
ファミリーのオブジェクトはそれらがどのタイムゾーンにいるのかについての概念を持っていないので、それを直接行うことは不可能です。したがって、UTCであるEpochに相対的な時間を見つけるためにタイムゾーン情報を供給する必要があります。
このようなLocalDateTime
があるとします。
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);
タイムゾーン情報を適用してZonedDateTime
を与える必要があります。私はロサンゼルスと同じタイムゾーンにいるので、次のようにします。
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));
もちろん、これはタイムゾーンについての仮定です。たとえば、現地時間で夏時間(サマータイム)移行に近い時刻が指定された場合などに、Edgeケースが発生する可能性があります。これらを脇に置いてみましょう、しかしあなたはこれらのケースが存在することを知っておくべきです。
とにかく、有効なZonedDateTime
を取得できれば、これをEpochからのミリ秒数に変換することができます。
long millis = zdt.toInstant().toEpochMilli();
タイムゾーンを指定しないので、
System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());
与える
ldt 1424812121078
ctm 1424812121281
念のためSystem.current ....が気に入らない場合はInstant.now().toEpochMilli()
を使用してください。
ZoneIdを回避するには、次のようにします。
LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);
System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());
値として0を得る、そうです!
Java 8以降、Java.time.Instant.toEpochMilli()
を呼び出すことができます。
例えば電話
final long currentTimeJava8 = Instant.now().toEpochMilli();
と同じ結果が得られます
final long currentTimeJava1 = System.currentTimeMillis();
現在時刻をミリ秒単位で取得するには(エポック以降)、System.currentTimeMillis()
を使用します。
Java.sql.Timestamp
を使用してミリ秒を取得することもできます。
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
ありがとうございます。
あなたがJava 8 Clockを持っているなら、あなたはclock.millis()
を使うことができます(もっと正確なので、Java 8 Instantを得るためにclock.instant()
を使うことをお勧めします)。
なぜJava 8クロックを使うのですか?そのため、DIフレームワークでClock Beanを作成できます。
@Bean
public Clock getClock() {
return Clock.systemUTC();
}
それからあなたのテストであなたは簡単にそれをモックすることができます:
@MockBean private Clock clock;
あるいは、別のBeanを使用することもできます。
@Bean
public Clock getClock() {
return Clock.fixed(instant, zone);
}
これは、日時を計り知れないほど主張するテストに役立ちます。
default LocalDateTime getDateFromLong(long timestamp) {
try {
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
} catch (DateTimeException tdException) {
// throw new
}
}
default Long getLongFromDateTime(LocalDateTime dateTime) {
return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}