LocalDate
新しい、LocalTime
またはLocalDateTime
Java 8 のクラスを使用して、1970 年 1 月 1 日 (エポック) 以降の現在のミリ秒を取得する方法があるかどうか疑問に思っています。
既知の方法は次のとおりです。
long currentMilliseconds = new Date().getTime();
また
long currentMilliseconds = System.currentTimeMillis();
LocalDate
新しい、LocalTime
またはLocalDateTime
Java 8 のクラスを使用して、1970 年 1 月 1 日 (エポック) 以降の現在のミリ秒を取得する方法があるかどうか疑問に思っています。
既知の方法は次のとおりです。
long currentMilliseconds = new Date().getTime();
また
long currentMilliseconds = System.currentTimeMillis();
「現在のミリ秒」が何を意味するのか完全にはわかりませんが、「エポック」、つまり UTC 1970 年 1 月 1 日の午前 0 時からのミリ秒数であると仮定します。
現在のエポックからのミリ秒数を知りたい場合は、 Anubian Noob が指摘したように使用System.currentTimeMillis()
します。もしそうなら、これを行うために新しい java.time API を使用する理由はありません。
ただし、すでにLocalDateTime
どこかからまたは同様のオブジェクトがあり、それをエポックからのミリ秒に変換したい場合があります。LocalDateTime
オブジェクトのファミリーにはそれらがどのタイムゾーンにあるかの概念がないため、それを直接行うことはできません。したがって、タイムゾーン情報を提供して、UTC であるエポックに関連する時間を見つける必要があります。
LocalDateTime
次のようなものがあるとします。
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);
タイムゾーン情報を適用して、ZonedDateTime
. 私はロサンゼルスと同じタイムゾーンにいるので、次のようにします。
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));
もちろん、これはタイムゾーンに関する仮定を行います。また、たとえば、現地時間が夏時間 (夏時間) への移行に近い時間を示している場合など、発生する可能性のあるエッジ ケースがあります。これらは脇に置いておきますが、これらのケースが存在することに注意する必要があります。
とにかく、有効な を取得できれば、ZonedDateTime
次のように、これをエポックからのミリ秒数に変換できます。
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.currentTimeMillis が気に入らない場合に備えて、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 を取得します。
これを試すことができます:
long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();
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();
}
誰もここで言及していない利用可能な方法がいくつかあります。しかし、それらが機能しない理由はわかりません。
の場合はLocalDate
、toEpochDay()
メソッドを使用できます。1970 年 1 月 1 日からの日数を返します。その数値は、ミリ秒に簡単に変換できます。
long dateInMillis = TimeUnit.DAYS.toMillis(myLocalDate.toEpochDays());
ドキュメントはここにあります。
の場合はLocalDateTime
、toEpochSecond()
メソッドを使用できます。1970 年 1 月 1 日からの秒数を返します。その数値もミリ秒に変換できます。
long dateTimeInMillis = TimeUnit.SECONDS.toMillis(myLocalDateTime.toEpochSeconds());
そのためのドキュメントはこちらです。