覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

java.time.LocalDateTime

java.time.LocalDateTimeの利用サンプルです。

サンプルコードで試したのは以下の通りです。


現在日時の取得

■API

  • LocalDateTime#now

■サンプル

// 現在日付
LocalDateTime date1 = LocalDateTime.now();
System.out.println("date1 : " + date1);

■実行結果

date1 : 2016-09-14T06:29:39.437


特定の日時を指定してのインスタンス生成

■API

  • LocalDateTime#of

■サンプル

// 年・月・日・時・分を指定(2013/12/31 15:30)
LocalDateTime date2 = LocalDateTime.of(2013, 12, 31, 15, 30);
System.out.println("date2 : " + date2);

// 年・月・日・時・分・秒を指定(2013/6/1 09:05:10)
LocalDateTime date3 = LocalDateTime.of(2013, Month.JUNE, 1, 9, 5, 10);
System.out.println("date3 : " + date3);

■実行結果

date2 : 2013-12-31T15:30
date3 : 2013-06-01T09:05:10


年・月・日・時・分・秒の個別取得

■API

  • LocalDateTime#getYear
  • LocalDateTime#getMonth
  • LocalDateTime#getDayOfMonth
  • LocalDateTime#getDayOfWeek
  • LocalDateTime#getHour
  • LocalDateTime#getMinute
  • LocalDateTime#getSecond

■サンプル

LocalDateTime date4 = LocalDateTime.of(2013, 1, 31, 23, 59, 1);
System.out.println("date4 : ");
System.out.println(" 年:" + date4.getYear());
System.out.println(" 月:" + date4.getMonth());
System.out.println(" 日:" + date4.getDayOfMonth());
System.out.println(" 曜日:" + date4.getDayOfWeek());
System.out.println(" 時:" + date4.getHour());
System.out.println(" 分:" + date4.getMinute());
System.out.println(" 秒:" + date4.getSecond());

■実行結果

date4 : 
 年:2013
 月:JANUARY
 日:31
 曜日:THURSDAY
 時:23
 分:59
 秒:1


加減算

■API

  • LocalDateTime#plusYears
  • LocalDateTime#plusMonths
  • LocalDateTime#plusDays
  • LocalDateTime#plusHours
  • LocalDateTime#plusMinutes
  • LocalDateTime#plusSeconds
  • LocalDateTime#minusYears
  • LocalDateTime#minusMonths
  • LocalDateTime#minusDays
  • LocalDateTime#minusHours
  • LocalDateTime#minusMinutes
  • LocalDateTime#minusSeconds

■サンプル

// 加減算してみる
LocalDateTime date5 = LocalDateTime.of(2013, 1, 31, 23, 59, 1);
System.out.println(date5 + "の1年後: " + date5.plusYears(1));
System.out.println(date5 + "の2ヶ月後: " + date5.plusMonths(2));
System.out.println(date5 + "の3日後: " + date5.plusDays(3));
System.out.println(date5 + "の4時間後: " + date5.plusHours(4));
System.out.println(date5 + "の5分後: " + date5.plusMinutes(5));
System.out.println(date5 + "の6秒後: " + date5.plusSeconds(6));
System.out.println(date5 + "の1年前: " + date5.minusYears(1));
System.out.println(date5 + "の2ヶ月前: " + date5.minusMonths(2));
System.out.println(date5 + "の3日前: " + date5.minusDays(3));
System.out.println(date5 + "の4時間前: " + date5.minusHours(4));
System.out.println(date5 + "の5分前: " + date5.minusMinutes(5));
System.out.println(date5 + "の6秒前: " + date5.minusSeconds(6));

// 期間を加減算してみる
LocalDateTime date6 = LocalDateTime.of(2013, 1, 1, 23, 59, 1);
// 3日間を加算・減算してみる
System.out.println(date6 + "の3日後: " + date6.plus(Period.ofDays(3)));
System.out.println(date6 + "の3日前: " + date6.minus(Period.ofDays(3)));

// 3時間を加算・減算してみる
System.out.println(date6 + "の3時間後: " + date6.plus(Duration.ofHours(3)));
System.out.println(date6 + "の3時間前: " + date6.minus(Duration.ofHours(3)));

■実行結果

2013-01-31T23:59:01の1年後: 2014-01-31T23:59:01
2013-01-31T23:59:01の2ヶ月後: 2013-03-31T23:59:01
2013-01-31T23:59:01の3日後: 2013-02-03T23:59:01
2013-01-31T23:59:01の4時間後: 2013-02-01T03:59:01
2013-01-31T23:59:01の5分後: 2013-02-01T00:04:01
2013-01-31T23:59:01の6秒後: 2013-01-31T23:59:07
2013-01-31T23:59:01の1年前: 2012-01-31T23:59:01
2013-01-31T23:59:01の2ヶ月前: 2012-11-30T23:59:01
2013-01-31T23:59:01の3日前: 2013-01-28T23:59:01
2013-01-31T23:59:01の4時間前: 2013-01-31T19:59:01
2013-01-31T23:59:01の5分前: 2013-01-31T23:54:01
2013-01-31T23:59:01の6秒前: 2013-01-31T23:58:55
2013-01-01T23:59:01の3日後: 2013-01-04T23:59:01
2013-01-01T23:59:01の3日前: 2012-12-29T23:59:01
2013-01-01T23:59:01の3時間後: 2013-01-02T02:59:01
2013-01-01T23:59:01の3時間前: 2013-01-01T20:59:01


文字列からのparse

■API

  • LocalDateTime#parse

■サンプル

// 日付文字列からparseしてみる
LocalDateTime date7 = 
    LocalDateTime.parse("2013/07/01 12:34:55", DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
System.out.println("date7 : " + date7);

■実行結果

date7 : 2013-07-01T12:34:55


LocalDateTimeからLocalDate, LocalTimeの取得

■API

  • LocalDateTime#toLocalDate
  • LocalDateTime#toLocalTime

■サンプル

// LocalDateTimeからLocalDate、LocalTimeを取得
LocalDateTime date8 = LocalDateTime.of(2013, 1, 3, 10, 12, 20);
System.out.println("date8 : " + date8);
System.out.println("date8から取得したLocalDate : " + date8.toLocalDate());
System.out.println("date8から取得したLocalTime : " + date8.toLocalTime());

■実行結果

date8 : 2013-01-03T10:12:20
date8から取得したLocalDate : 2013-01-03
date8から取得したLocalTime : 10:12:20


LocalDateTimeの内容を更新する

■API

  • LocalDateTime#withYear
  • LocalDateTime#withDayOfMonth
  • LocalDateTime#withHour
  • LocalDateTime#withMinute

■サンプル

// LocalDateTimeの各日時の要素を置き換えて新しいLocalTimeDateを取得する
LocalDateTime date9 = LocalDateTime.of(2013, 1, 3, 10, 12, 20);
System.out.println("date9 : " + date9);
System.out.println(date9 + " の年を2012に置き換え : " + date9.withYear(2012));
System.out.println(date9 + " の日を31に置き換え : " + date9.withDayOfMonth(31));
System.out.println(date9 + " の時を23に置き換え : " + date9.withHour(23));
System.out.println(date9 + " の分を0に置き換え : " + date9.withMinute(0));

■実行結果

date9 : 2013-01-03T10:12:20
2013-01-03T10:12:20 の年を2012に置き換え : 2012-01-03T10:12:20
2013-01-03T10:12:20 の日を31に置き換え : 2013-01-31T10:12:20
2013-01-03T10:12:20 の時を23に置き換え : 2013-01-03T23:12:20
2013-01-03T10:12:20 の分を0に置き換え : 2013-01-03T10:00:20


不正な日時の生成

■サンプル

// 存在しない2013年2月30日12時31分50秒とか指定するとDateTimeExceptionがスローされる
try {
    LocalDateTime.of(2013, Month.FEBRUARY, 30, 12, 31, 50);
} catch (DateTimeException e) {
    e.printStackTrace();
}

■実行結果

java.time.DateTimeException: Invalid date 'FEBRUARY 30'
    at java.time.LocalDate.create(LocalDate.java:431)
    at java.time.LocalDate.of(LocalDate.java:249)
    at sample.java8.Java8LocalDateClient.main(Java8LocalDateClient.java:59)




試したソースコードの全体は以下です。

import java.time.DateTimeException;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.Period;
import java.time.format.DateTimeFormatter;

public class Java8LocalDateTimeClient {

    public static void main(String[] args) {

        // 現在日時
        LocalDateTime date1 = LocalDateTime.now();
        System.out.println("date1 : " + date1);

        // 年・月・日・時・分を指定(2013/12/31 15:30)
        LocalDateTime date2 = LocalDateTime.of(2013, 12, 31, 15, 30);
        System.out.println("date2 : " + date2);

        // 年・月・日・時・分・秒を指定(2013/6/1 09:05:10)
        LocalDateTime date3 = LocalDateTime.of(2013, Month.JUNE, 1, 9, 5, 10);
        System.out.println("date3 : " + date3);

        // 生成した日時の年・月・日・曜日を個別に取り出す
        LocalDateTime date4 = LocalDateTime.of(2013, 1, 31, 23, 59, 1);
        System.out.println("date4 : ");
        System.out.println(" 年:" + date4.getYear());
        System.out.println(" 月:" + date4.getMonth());
        System.out.println(" 日:" + date4.getDayOfMonth());
        System.out.println(" 曜日:" + date4.getDayOfWeek());
        System.out.println(" 時:" + date4.getHour());
        System.out.println(" 分:" + date4.getMinute());
        System.out.println(" 秒:" + date4.getSecond());

        // 加減算してみる
        LocalDateTime date5 = LocalDateTime.of(2013, 1, 31, 23, 59, 1);
        System.out.println(date5 + "の1年後: " + date5.plusYears(1));
        System.out.println(date5 + "の2ヶ月後: " + date5.plusMonths(2));
        System.out.println(date5 + "の3日後: " + date5.plusDays(3));
        System.out.println(date5 + "の4時間後: " + date5.plusHours(4));
        System.out.println(date5 + "の5分後: " + date5.plusMinutes(5));
        System.out.println(date5 + "の6秒後: " + date5.plusSeconds(6));
        System.out.println(date5 + "の1年前: " + date5.minusYears(1));
        System.out.println(date5 + "の2ヶ月前: " + date5.minusMonths(2));
        System.out.println(date5 + "の3日前: " + date5.minusDays(3));
        System.out.println(date5 + "の4時間前: " + date5.minusHours(4));
        System.out.println(date5 + "の5分前: " + date5.minusMinutes(5));
        System.out.println(date5 + "の6秒前: " + date5.minusSeconds(6));

        // 期間を加減算してみる
        LocalDateTime date6 = LocalDateTime.of(2013, 1, 1, 23, 59, 1);
        // 3日間を加算・減算してみる
        System.out.println(date6 + "の3日後: " + date6.plus(Period.ofDays(3)));
        System.out.println(date6 + "の3日前: " + date6.minus(Period.ofDays(3)));

        // 3時間を加算・減算してみる
        System.out.println(date6 + "の3時間後: " + date6.plus(Duration.ofHours(3)));
        System.out.println(date6 + "の3時間前: " + date6.minus(Duration.ofHours(3)));

        // 日付文字列からparseしてみる
        LocalDateTime date7 =
            LocalDateTime.parse("2013/07/01 12:34:55", DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
        System.out.println("date7 : " + date7);

        // LocalDateTimeからLocalDate、LocalTimeを取得
        LocalDateTime date8 = LocalDateTime.of(2013, 1, 3, 10, 12, 20);
        System.out.println("date8 : " + date8);
        System.out.println("date8から取得したLocalDate : " + date8.toLocalDate());
        System.out.println("date8から取得したLocalTime : " + date8.toLocalTime());

        // LocalDateTimeの各日時の要素を置き換えて新しいLocalTimeDateを取得する
        LocalDateTime date9 = LocalDateTime.of(2013, 1, 3, 10, 12, 20);
        System.out.println("date9 : " + date9);
        System.out.println(date9 + " の年を2012に置き換え : " + date9.withYear(2012));
        System.out.println(date9 + " の日を31に置き換え : " + date9.withDayOfMonth(31));
        System.out.println(date9 + " の時を23に置き換え : " + date9.withHour(23));
        System.out.println(date9 + " の分を0に置き換え : " + date9.withMinute(0));

        System.out.println("###");

        // 存在しない2013年2月30日12時31分50秒とか指定するとDateTimeExceptionがスローされる
        // (DateTimeExceptionは実行時例外なのも今っぽい気がします)
        try {
            LocalDateTime.of(2013, Month.FEBRUARY, 30, 12, 31, 50);
        } catch (DateTimeException e) {
            e.printStackTrace();
        }
    }
}



関連エントリ