UnixTimeに変換しよう
Java8で便利になった日付API
皆さんはJava8で一新された日付APIを利用していますか?
以前、当ブログでもご紹介致しました。
関連記事
【Java8の日付操作】DateやCalendarを使うのを止めてLocalDateとLocalDateTimeを使って幸せになろう【初期化】
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の場合は以下のように記述します。
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);
}
}
まずはLocalDateをZonedDateTimeに変換します。
この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。
そして、ZonedDateTimeのtoEpochSecondメソッドを使うことで秒単位のUnixTimeを取得することが可能になります♪
確認
それでは実行してみましょう。
2019-01-30
1548806400
それっぽい値が取れましたね。
では、このUnixTimeから日付に変換してみます。
2019年 1月30日 水曜日 00時00分00秒 JST
正しく変換出来ていますね♪
LocalDateTime
LocalDateTimeの場合は以下のように記述します。
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の時と同じです。
まずはLocalDateをZonedDateTimeに変換します。
この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。
そして、ZonedDateTimeのtoEpochSecondメソッドを使うことで秒単位のUnixTimeを取得することが可能になります♪
確認
それでは実行してみましょう。
2019-01-30T11:41:39.321
1548816099
それっぽい値が取れましたね。
では、このUnixTimeから日付に変換してみます。
2019年 1月30日 水曜日 11時41分39秒 JST
こちらも正しく変換出来ていますね♪
ミリ秒単位
次はミリ秒までのUnixTimeを取得してみます。
LocalDate
LocalDateの場合は以下のように記述します。
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 );
}
}
まずはLocalDateをZonedDateTimeに変換します。
この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。
ここまでは秒単位の流れと同じですね。
そして、ここがポイントなのですが、ZonedDateTimeのtoInstantメソッドで一旦Instant化してからtoEpochMilliメソッドを使うことでミリ秒単位のUnixTimeを取得することが可能になります♪
確認
それでは実行してみましょう。
2019-01-30
1548774000000
こちらもそれっぽい値が取れました。
では、こちらもUnixTimeから日付に変換してみます。
dateコマンドでミリ秒のUnixTimeから復元する方法がイマイチわからなかったので、コチラ のサイトで変換して確認しました。

正しく変換出来ていますね♪
LocalDateTime
LocalDateTimeの場合は以下のように記述します。
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 );
}
}
まずはLocalDateをZonedDateTimeに変換します。
この際に、UTCなのかJSTなのかで引数の値を変える必要があるので気をつけましょう。
ここまでは秒単位の流れと同じですね。
そして、ここがポイントなのですが、ZonedDateTimeのtoInstantメソッドで一旦Instant化してからtoEpochMilliメソッドを使うことでミリ秒単位のUnixTimeを取得することが可能になります♪
確認
それでは実行してみましょう。
2019-01-30T11:57:31.122
1548817051122
こちらもそれっぽい値が取れました。
では、こちらもUnixTimeから日付に変換してみます。

こちらも正しく変換出来ていますね♪
終わりに
以上のように、新しい日付APIを利用していれば、独自実装することなく既存のメソッドを利用することで簡単にUnixTimeを取得することが出来ました。
意外と知らない方が多いと思うので、困っている方はこちらの方法で試してみてください♪
