Featured image of post Java8でUnixTimeを秒・ミリ秒で取得する方法【LocalDateTime】

Java8でUnixTimeを秒・ミリ秒で取得する方法【LocalDateTime】

Java8の日付API(LocalDate / LocalDateTime)からUnixTimeを取得する方法。秒単位はtoEpochSecond、ミリ秒単位はtoEpochMilliを使います。UnixTimeから日付へ戻す変換もサンプルつきでご紹介♪

1955文字

UnixTimeに変換しよう

Java8で便利になった日付API

皆さんはJava8で一新された日付APIを利用していますか?

以前、当ブログでもご紹介致しました。

関連記事 【Java8の日付操作】DateやCalendarを使うのを止めてLocalDateとLocalDateTimeを使って幸せになろう【初期化】 2018/10/01 1130文字 約3分で読めます IT Mac Windows パソコン プログラミング

筆者はすっかり使いやすさの虜になってしまい、CalendarクラスやDateクラスはめっきり使わなくなりました。

直感的に扱いやすい点が魅力的ですよね♪

UnixTimeに変換するには?

そんな中で、システム開発をしているとUnixTimeで日付時刻を取り扱っている場合が出てきます。

UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。GPS時刻などとは異なり、大多数のシステムでは、本当の経過秒数を表すものではない UNIX時間 - Wikipedia

しかし、この新しい日付APIを用いれば簡単UnixTimeに変換する事が出来ちゃいます!

今回はLocalDate及びLocalDateTimeそれぞれで、秒単位のパターンとミリ秒単位のパターンに変換する方法をご紹介致します。

手順

秒単位

まずは秒までUnixTimeを取得する方法をご紹介します。

LocalDate

LocalDateの場合は以下のように記述します。

Sample.java
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Sample
{
  public static void main( String... args)
  {

    LocalDate ld = LocalDate.now();
    System.out.println( ld );

    //ZonedDateTime zdt = ld.atStartOfDay(ZoneOffset.UTC); UTCの場合
    ZonedDateTime zdt = ld.atStartOfDay(ZoneOffset.ofHours(+9)); //JSTの場合

    long epochSecond = zdt.toEpochSecond();
    System.out.println( epochSecond);
  }
}

まずはLocalDateZonedDateTimeに変換します。

この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。

そして、ZonedDateTimetoEpochSecondメソッドを使うことで秒単位のUnixTimeを取得することが可能になります♪

確認

それでは実行してみましょう。

javac Sample.java && java Sample
2019-01-30
1548806400

それっぽい値が取れましたね。

では、このUnixTimeから日付に変換してみます。

date -r 1548774000
2019年 1月30日 水曜日 00時00分00秒 JST

正しく変換出来ていますね♪

LocalDateTime

LocalDateTimeの場合は以下のように記述します。

Sample.java
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Sample
{
  public static void main( String... args)
  {

    LocalDateTime ldt = LocalDateTime.now();
    System.out.println( ldt );

    //ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); UTCの場合
    ZonedDateTime zdt = ldt.atZone(ZoneOffset.ofHours(+9)); //JSTの場合

    long epochSecond = zdt.toEpochSecond();
    System.out.println( epochSecond );
  }
}

こちらも基本的にはLocalDateの時と同じです。

まずはLocalDateZonedDateTimeに変換します。

この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。

そして、ZonedDateTimetoEpochSecondメソッドを使うことで秒単位のUnixTimeを取得することが可能になります♪

確認

それでは実行してみましょう。

javac Sample.java && java Sample
2019-01-30T11:41:39.321
1548816099

それっぽい値が取れましたね。

では、このUnixTimeから日付に変換してみます。

date -r 1548816099
2019年 1月30日 水曜日 11時41分39秒 JST

こちらも正しく変換出来ていますね♪

ミリ秒単位

次はミリ秒までのUnixTimeを取得してみます。

LocalDate

LocalDateの場合は以下のように記述します。

Sample.java
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Sample
{
  public static void main( String... args)
  {

    LocalDate ld = LocalDate.now();
    System.out.println( ld );

    //ZonedDateTime zdt = ld.atStartOfDay(ZoneOffset.UTC); UTCの場合
    ZonedDateTime zdt = ld.atStartOfDay(ZoneOffset.ofHours(+9)); //JSTの場合

    long milliSecond = zdt.toInstant().toEpochMilli();
    System.out.println( milliSecond );
  }
}

まずはLocalDateZonedDateTimeに変換します。

この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。
ここまでは秒単位の流れと同じですね。

そして、ここがポイントなのですが、ZonedDateTimetoInstantメソッドで一旦Instant化してからtoEpochMilliメソッドを使うことでミリ秒単位UnixTimeを取得することが可能になります♪

確認

それでは実行してみましょう。

javac Sample.java && java Sample
2019-01-30
1548774000000

こちらもそれっぽい値が取れました。

では、こちらもUnixTimeから日付に変換してみます。

dateコマンドでミリ秒のUnixTimeから復元する方法がイマイチわからなかったので、コチラ のサイトで変換して確認しました。

正しく変換出来ていますね♪

LocalDateTime

LocalDateTimeの場合は以下のように記述します。

Sample.java
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Sample
{
  public static void main( String... args)
  {

    LocalDateTime ldt = LocalDateTime.now();
    System.out.println( ldt );

    //ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); UTCの場合
    ZonedDateTime zdt = ldt.atZone(ZoneOffset.ofHours(+9)); //JSTの場合

    long milliSecond = zdt.toInstant().toEpochMilli();
    System.out.println( milliSecond );
  }
}

まずはLocalDateZonedDateTimeに変換します。

この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。
ここまでは秒単位の流れと同じですね。

そして、ここがポイントなのですが、ZonedDateTimetoInstantメソッドで一旦Instant化してからtoEpochMilliメソッドを使うことでミリ秒単位UnixTimeを取得することが可能になります♪

確認

それでは実行してみましょう。

javac Sample.java && java Sample
2019-01-30T11:57:31.122
1548817051122

こちらもそれっぽい値が取れました。

では、こちらもUnixTimeから日付に変換してみます。

こちらも正しく変換出来ていますね♪

終わりに

以上のように、新しい日付APIを利用していれば、独自実装することなく既存のメソッドを利用することで簡単にUnixTimeを取得することが出来ました。

意外と知らない方が多いと思うので、困っている方はこちらの方法で試してみてください♪