読者です 読者をやめる 読者になる 読者になる

覚えたら書く

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

ThreeTen Backport

Java6やJava7で開発しなければならない状況でも、Java8で提供されているJSR-310(java.timeパッケージ)による日時操作をしたい場合があります。

そんな時は、ThreeTen Backportのお世話になりましょう。

「ThreeTen Backport」は、Java6, Java7向けにdate-time機能をバックポートしたものです。

■ライブラリの入手

Mavenの場合は、pom.xmlに以下を追加

<dependency>
  <groupId>org.threeten</groupId>
  <artifactId>threetenbp</artifactId>
  <version>1.3.2</version>
</dependency>

jarを直接ダウンロードする場合はMaven Central Repositoryから直接持ってきましょう http://search.maven.org/#artifactdetails%7Corg.threeten%7Cthreetenbp%7C1.3.2%7Cjar


以下利用サンプルです


org.threeten.bp.LocalDate

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

現在日付の取得

■API

  • LocalDate#now

■サンプル

// 現在日付
LocalDate date1 = LocalDate.now();
// 現在日付がyyyy-MM-dd 形式で出力される
System.out.println("date1 : " + date1);

■実行結果

date1 : 2016-09-30

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

■API

  • LocalDate#of

■サンプル

// 年月日を全て数値で指定(月をそのままの数値で指定できるの良いね(ex. 12月なら12と指定))
LocalDate date2 = LocalDate.of(2013, 12, 31);
// 2013-12-31 と出力される
System.out.println("date2 : " + date2);

// Monthを用いて指定
LocalDate date3 = LocalDate.of(2013, Month.JUNE, 1);
// 2013-06-01 と出力される
System.out.println("date3 : " + date3);

■実行結果

date2 : 2013-12-31
date3 : 2013-06-01

年・月・日・曜日の個別取得

■API

  • LocalDate#getYear
  • LocalDate#getMonth
  • LocalDate#getDayOfMonth
  • LocalDate#getDayOfWeek

■サンプル

// 2013-01-31を生成
LocalDate date4 = LocalDate.of(2013, 1, 31);
System.out.println("date4 : ");
// 年・月・日・曜日を個別に取り出す
System.out.println(" 年:" + date4.getYear());
System.out.println(" 月:" + date4.getMonth());
System.out.println(" 日:" + date4.getDayOfMonth());
System.out.println(" 曜日:" + date4.getDayOfWeek());

■実行結果

date4 : 
 年:2013
 月:JANUARY
 日:31
 曜日:THURSDAY

加減算

■API

  • LocalDate#plusDays
  • LocalDate#minusDays

■サンプル

// 加減算してみる(以下例は日の加減算ですが、月、年用のメソッドもあります)
LocalDate date5 = LocalDate.of(2013, 1, 31);
System.out.println(date5 + "の1日後: " + date5.plusDays(1));
System.out.println(date5 + "の40日後: " + date5.plusDays(40));
System.out.println(date5 + "の1日前: " + date5.minusDays(1));
System.out.println(date5 + "の40日前: " + date5.minusDays(40));

LocalDate date6 = LocalDate.of(2013, 1, 1);
// 7日間を加算してみる(Durationを引数に指定するとDateTimeExceptionが発生します)
System.out.println(date6 + "の7日後: " + date6.plus(Period.ofDays(7)));
// 7日間を減算してみる(Durationを引数に指定するとDateTimeExceptionが発生します)
System.out.println(date6 + "の7日前: " + date6.minus(Period.ofDays(7)));

■実行結果

2013-01-31の1日後: 2013-02-01
2013-01-31の40日後: 2013-03-12
2013-01-31の1日前: 2013-01-30
2013-01-31の40日前: 2012-12-22
2013-01-01の7日後: 2013-01-08
2013-01-01の7日前: 2012-12-25

文字列からのparse

■API

  • LocalDate#parse

■サンプル

// 日付文字列からparseしてみる
LocalDate date7 = LocalDate.parse("2013/07/07", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
System.out.println("date7 : " + date7);

■実行結果

date7 : 2013-07-07

不正な日付の生成

■サンプル

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

■実行結果

org.threeten.bp.DateTimeException: Invalid date 'FEBRUARY 30'
    at org.threeten.bp.LocalDate.create(LocalDate.java:385)
    at org.threeten.bp.LocalDate.of(LocalDate.java:220)
    at sample.threeten.LocalDateClient.main(LocalDateClient.java:58)

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

import org.threeten.bp.DateTimeException;
import org.threeten.bp.LocalDate;
import org.threeten.bp.Month;
import org.threeten.bp.Period;
import org.threeten.bp.format.DateTimeFormatter;

public class LocalDateClient {

    public static void main(String[] args) {

        // 現在日付
        LocalDate date1 = LocalDate.now();
        // 現在日付がyyyy-MM-dd 形式で出力される
        System.out.println("date1 : " + date1);

        // 年月日を全て数値で指定(月をそのままの数値で指定できるの良いね(ex. 12月なら12と指定))
        LocalDate date2 = LocalDate.of(2013, 12, 31);
        // 2013-12-31 と出力される
        System.out.println("date2 : " + date2);

        // Monthを用いて指定
        LocalDate date3 = LocalDate.of(2013, Month.JUNE, 1);
        // 2013-06-01 と出力される
        System.out.println("date3 : " + date3);

        // 2013-01-31を生成
        LocalDate date4 = LocalDate.of(2013, 1, 31);
        System.out.println("date4 : ");
        // 年・月・日・曜日を個別に取り出す
        System.out.println(" 年:" + date4.getYear());
        System.out.println(" 月:" + date4.getMonth());
        System.out.println(" 日:" + date4.getDayOfMonth());
        System.out.println(" 曜日:" + date4.getDayOfWeek());

        // 加減算してみる(以下例は日の加減算ですが、月、年用のメソッドもあります)
        LocalDate date5 = LocalDate.of(2013, 1, 31);
        System.out.println(date5 + "の1日後: " + date5.plusDays(1));
        System.out.println(date5 + "の40日後: " + date5.plusDays(40));
        System.out.println(date5 + "の1日前: " + date5.minusDays(1));
        System.out.println(date5 + "の40日前: " + date5.minusDays(40));

        LocalDate date6 = LocalDate.of(2013, 1, 1);
        // 7日間を加算してみる(Durationを引数に指定するとDateTimeExceptionが発生します)
        System.out.println(date6 + "の7日後: " + date6.plus(Period.ofDays(7)));
        // 7日間を減算してみる(Durationを引数に指定するとDateTimeExceptionが発生します)
        System.out.println(date6 + "の7日前: " + date6.minus(Period.ofDays(7)));

        // 日付文字列からparseしてみる
        LocalDate date7 = LocalDate.parse("2013/07/07", DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        System.out.println("date7 : " + date7);

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

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



org.threeten.bp.LocalTime

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

現在時刻の取得

■API

  • LocalTime#now

■サンプル

LocalTime time1 = LocalTime.now();
System.out.println("time1 : " + time1);

■実行結果

time1 : 10:30:13.779

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

■API

  • LocalTime#of

■サンプル

// 時・分を指定(23時59分)
LocalTime time2 = LocalTime.of(23, 59);
System.out.println("time2 : " + time2);

// 時・分・秒を指定(0時1分2秒)
LocalTime time3 = LocalTime.of(0, 1, 2);
System.out.println("time3 : " + time3);

// 時・分・秒・ナノ秒指定(23時59分59秒10ナノ秒)
LocalTime time4 = LocalTime.of(23, 59, 59, 59);
System.out.println("time4 : " + time4);

■実行結果

time2 : 23:59
time3 : 00:01:02
time4 : 23:59:59.000000059

時・分・秒の個別取得

■API

  • LocalTime#getHour
  • LocalTime#getMinute
  • LocalTime#getSecond
  • LocalTime#getNano

■サンプル

// 12時30分20秒を生成
LocalTime time5 = LocalTime.of(12, 30, 20);
System.out.println("time5 : ");
// 時・分・秒・ナノ秒を個別に取り出す
System.out.println(" 時:" + time5.getHour());
System.out.println(" 分:" + time5.getMinute());
System.out.println(" 秒:" + time5.getSecond());
System.out.println(" ナノ秒:" + time5.getNano());

■実行結果

time5 : 
 時:12
 分:30
 秒:20
 ナノ秒:0

加減算

■API

  • LocalTime#plusSeconds
  • LocalTime#plusMinutes
  • LocalTime#plusHours
  • LocalTime#minusSeconds
  • LocalTime#minusMinutes
  • LocalTime#minusHours
  • LocalTime#plus(Duration)
  • LocalTime#minus(Duration)

■サンプル

// 秒・分・時間を加減算してみる
LocalTime time6 = LocalTime.of(12, 30, 20);
System.out.println(time6 + "の10秒後: " + time6.plusSeconds(10));
System.out.println(time6 + "の30分後: " + time6.plusMinutes(30));
System.out.println(time6 + "の1時間後: " + time6.plusHours(1));
System.out.println(time6 + "の30秒前: " + time5.minusSeconds(30));
System.out.println(time6 + "の3分前: " + time5.minusMinutes(3));
System.out.println(time6 + "の13時間前: " + time5.minusHours(13));

LocalTime time7 = LocalTime.of(11, 22, 33);
// 7分間を加算・減算してみる
System.out.println(time7 + "の7分後: " + time7.plus(Duration.ofMinutes(7)));
System.out.println(time7 + "の7分前: " + time7.minus(Duration.ofMinutes(7)));

■実行結果

12:30:20の10秒後: 12:30:30
12:30:20の30分後: 13:00:20
12:30:20の1時間後: 13:30:20
12:30:20の30秒前: 12:29:50
12:30:20の3分前: 12:27:20
12:30:20の13時間前: 23:30:20
11:22:33の7分後: 11:29:33
11:22:33の7分前: 11:15:33

文字列からのparse

■API

  • LocalTime#parse

■サンプル

// 時刻文字列からparseしてみる
LocalTime time8 = LocalTime.parse("12:34:56", DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println("time8 : " + time8);

■実行結果

time8 : 12:34:56

不正な時刻の生成

■サンプル

// 存在しない23時61分0秒とか指定するとDateTimeExceptionがスローされる
try {
    LocalTime.of(23, 61, 0);
} catch (DateTimeException e) {
    e.printStackTrace();
}

■実行結果

org.threeten.bp.DateTimeException: Invalid value for MinuteOfHour (valid values 0 - 59): 61
    at org.threeten.bp.temporal.ValueRange.checkValidValue(ValueRange.java:278)
    at org.threeten.bp.temporal.ChronoField.checkValidValue(ChronoField.java:557)
    at org.threeten.bp.LocalTime.of(LocalTime.java:299)
    at sample.threeten.LocalTimeClient.main(LocalTimeClient.java:59)

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

import org.threeten.bp.DateTimeException;
import org.threeten.bp.Duration;
import org.threeten.bp.LocalTime;
import org.threeten.bp.format.DateTimeFormatter;

public class LocalTimeClient {

    public static void main(String[] args) {

        // 現在時刻
        LocalTime time1 = LocalTime.now();
        System.out.println("time1 : " + time1);

        // 時・分を指定(23時59分)
        LocalTime time2 = LocalTime.of(23, 59);
        System.out.println("time2 : " + time2);

        // 時・分・秒を指定(0時1分2秒)
        LocalTime time3 = LocalTime.of(0, 1, 2);
        System.out.println("time3 : " + time3);

        // 時・分・秒・ナノ秒指定(23時59分59秒10ナノ秒)
        LocalTime time4 = LocalTime.of(23, 59, 59, 59);
        System.out.println("time4 : " + time4);

        // 12時30分20秒を生成
        LocalTime time5 = LocalTime.of(12, 30, 20);
        System.out.println("time5 : ");
        // 時・分・秒・ナノ秒を個別に取り出す
        System.out.println(" 時:" + time5.getHour());
        System.out.println(" 分:" + time5.getMinute());
        System.out.println(" 秒:" + time5.getSecond());
        System.out.println(" ナノ秒:" + time5.getNano());

        // 秒・分・時間を加減算してみる
        LocalTime time6 = LocalTime.of(12, 30, 20);
        System.out.println(time6 + "の10秒後: " + time6.plusSeconds(10));
        System.out.println(time6 + "の30分後: " + time6.plusMinutes(30));
        System.out.println(time6 + "の1時間後: " + time6.plusHours(1));
        System.out.println(time6 + "の30秒前: " + time5.minusSeconds(30));
        System.out.println(time6 + "の3分前: " + time5.minusMinutes(3));
        System.out.println(time6 + "の13時間前: " + time5.minusHours(13));

        LocalTime time7 = LocalTime.of(11, 22, 33);
        // 7分間を加算・減算してみる
        System.out.println(time7 + "の7分後: " + time7.plus(Duration.ofMinutes(7)));
        System.out.println(time7 + "の7分前: " + time7.minus(Duration.ofMinutes(7)));

        // 時刻文字列からparseしてみる
        LocalTime time8 = LocalTime.parse("12:34:56", DateTimeFormatter.ofPattern("HH:mm:ss"));
        System.out.println("time8 : " + time8);

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

        // 存在しない23時61分0秒とか指定するとDateTimeExceptionがスローされる
        try {
            LocalTime.of(23, 61, 0);
        } catch (DateTimeException e) {
            e.printStackTrace();
        }
    }
}



org.threeten.bp.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();
}

■実行結果

org.threeten.bp.DateTimeException: Invalid date 'FEBRUARY 30'
    at org.threeten.bp.LocalDate.create(LocalDate.java:385)
    at org.threeten.bp.LocalDate.of(LocalDate.java:220)
    at org.threeten.bp.LocalDateTime.of(LocalDateTime.java:229)
    at sample.threeten.LocalDateTimeClient.main(LocalDateTimeClient.java:86)

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

import org.threeten.bp.DateTimeException;
import org.threeten.bp.Duration;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.Month;
import org.threeten.bp.Period;
import org.threeten.bp.format.DateTimeFormatter;

public class LocalDateTimeClient {

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



関連エントリ