378

LocalDate新しい、LocalTimeまたはLocalDateTimeJava 8 のクラスを使用して、1970 年 1 月 1 日 (エポック) 以降の現在のミリ秒を取得する方法があるかどうか疑問に思っています。

既知の方法は次のとおりです。

long currentMilliseconds = new Date().getTime();

また

long currentMilliseconds = System.currentTimeMillis();
4

14 に答える 14

409

「現在のミリ秒」が何を意味するのか完全にはわかりませんが、「エポック」、つまり 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();
于 2014-05-30T01:46:55.997 に答える
124

タイムゾーンを指定しないように私がしていることは、

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()

于 2015-02-24T21:12:08.947 に答える
24

ZoneId を回避するには、次のようにします。

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

値として 0 を取得します。

于 2015-05-13T16:00:49.123 に答える
9

これを試すことができます:

long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();
于 2020-12-15T10:42:31.460 に答える
2
  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();
}
于 2019-08-25T16:04:57.397 に答える
0

誰もここで言及していない利用可能な方法がいくつかあります。しかし、それらが機能しない理由はわかりません。

の場合はLocalDatetoEpochDay()メソッドを使用できます。1970 年 1 月 1 日からの日数を返します。その数値は、ミリ秒に簡単に変換できます。

long dateInMillis = TimeUnit.DAYS.toMillis(myLocalDate.toEpochDays());

ドキュメントはここにあります。

の場合はLocalDateTimetoEpochSecond()メソッドを使用できます。1970 年 1 月 1 日からの秒数を返します。その数値もミリ秒に変換できます。

long dateTimeInMillis = TimeUnit.SECONDS.toMillis(myLocalDateTime.toEpochSeconds());

そのためのドキュメントはこちらです。

于 2022-02-03T20:13:47.143 に答える