web-dev-qa-db-ja.com

Java 8でLocalDateTimeからミリ秒を取得する方法

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

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

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

または

long currentMilliseconds = System.currentTimeMillis();
210

「現在のミリ秒」が何を意味するのか完全にはわかりませんが、「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();
263
Stuart Marks

タイムゾーンを指定しないので、

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()を使用してください。

67
brian

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

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

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

値として0を得る、そうです!

16
Dani

Java 8以降、Java.time.Instant.toEpochMilli()を呼び出すことができます。

例えば電話

final long currentTimeJava8 = Instant.now().toEpochMilli();

と同じ結果が得られます

final long currentTimeJava1 = System.currentTimeMillis();
10
Marteng

現在時刻をミリ秒単位で取得するには(エポック以降)、System.currentTimeMillis()を使用します。

7
Anubian Noob

Java.sql.Timestampを使用してミリ秒を取得することもできます。

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);

ありがとうございます。

3
Nalam

あなたが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);
}

これは、日時を計り知れないほど主張するテストに役立ちます。

2
JeeBee
  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();
}
0
Mohamed.Abdo