Javaでの増分日

1概要

このチュートリアルでは、Javaを使用して日付を1日ずつ増やす方法について説明します。 Java 8以前は、標準のJava日付/時刻ライブラリは非常にユーザーフレンドリーではありませんでした。そのため、Joda-Timeは、Java 8より前のJavaの事実上の標準の日時ライブラリになりました。

java.util.Calendar やApache Commonsなど、このタスクを実行するために使用できる他のクラスやライブラリもあります。

Java 8には、以前のライブラリの欠点を解決するためのより良い日時APIが含まれていました。

したがって、Java 8、Joda-Time API、Javaの Calendar クラス、およびApache Commonsライブラリを使用して、日付を1日ずつ増やす方法を検討しています。

2 Mavenの依存関係

以下の依存関係が pom.xml ファイルに含まれているはずです。

<dependencies>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.5</version>
    </dependency>
</dependencies>

あなたはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22joda-time%22%20AND%20a%3A%22joda-timeでJoda-Timeの最新バージョンを見つけることができます。 %22[Maven Central]、それにhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%の最新バージョン22commons-lang3%22[Apache Commons Lang]。

3 java.time を使用する

__java.time.LocalDate __classは不変の日時表現で、多くの場合年月日として表示されます。

____LocalDateには、日付を操作するためのメソッドがたくさんあります。同じタスクを実行するためにそれを使用する方法を見てみましょう。

public static String addOneDay(String date) {
    return LocalDate
      .parse(date)
      .plusDays(1)
      .toString();
}

この例では、 __ java.time.LocalDate classとその plusDays() __メソッドを使用して、日付を1日ずつ増やしています。

それでは、このメソッドが期待どおりに機能していることを確認しましょう。

@Test
public void givenDate__whenUsingJava8__thenAddOneDay()
  throws Exception {

    String incrementedDate = addOneDay("2018-07-03");
    assertEquals("2018-07-04", incrementedDate);
}

4 java.util.Calendar を使用する

別の方法は、日付を増やすために __java.util.Calendar とその add()__メソッドを使用することです。

__java.text.SimpleDateFormat __とともに、日付の書式設定に使用します。

public static String addOneDayCalendar(String date)
  throws ParseException {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Calendar c = Calendar.getInstance();
    c.setTime(sdf.parse(date));
    c.add(Calendar.DATE, 1);
    return sdf.format(c.getTime());
}

__java.text.SimpleDateFormatは、予想される日付形式が使用されるようにするためのものです。日付は add() __methodによって増やされます。

もう一度、このアプローチが意図したとおりに機能することを確認しましょう。

@Test
public void givenDate__whenUsingCalendar__thenAddOneDay()
  throws Exception {

    String incrementedDate = addOneDayCalendar("2018-07-03");
    assertEquals("2018-07-04", incrementedDate);
}

5 Joda-Time を使う

__org.joda.time.DateTime __classには、日付と時刻を正しく処理するのに役立つ多くのメソッドがあります。

1日ずつ日付を増やすためにそれを使用する方法を見てみましょう:

public static String addOneDayJodaTime(String date) {
    DateTime dateTime = new DateTime(date);
    return dateTime
      .plusDays(1)
      .toString("yyyy-MM-dd");
}

ここでは、日付を1日進めるために __org.joda.time.DateTime classとその plusDays() __methodを使います。

上記のコードが次の単体テストで機能することを確認できます。

@Test
public void givenDate__whenUsingJodaTime__thenAddOneDay() throws Exception {
    String incrementedDate = addOneDayJodaTime("2018-07-03");
    assertEquals("2018-07-04", incrementedDate);
}

6. Apache Commonsを使う

(とりわけ)日付操作によく使用されるもう1つのライブラリーはApache Commonsです。これは、 java.util.Calendar および java.util.Date オブジェクトの使用を取り巻く一連のユーティリティです。

私たちの仕事では、 __org.apache.commons.lang3.time.DateUtils classとその addDays() メソッドを使用することができます( SimpleDateFormat__が日付のフォーマットにも使用されていることに注意してください)。

public static String addOneDayApacheCommons(String date)
  throws ParseException {

    SimpleDateFormat sdf
      = new SimpleDateFormat("yyyy-MM-dd");
    Date incrementedDate = DateUtils
      .addDays(sdf.parse(date), 1);
    return sdf.format(incrementedDate);
}

いつものように、ユニットテストで結果を検証します。

@Test
public void givenDate__whenUsingApacheCommons__thenAddOneDay()
  throws Exception {

    String incrementedDate = addOneDayApacheCommons(
      "2018-07-03");
    assertEquals("2018-07-04", incrementedDate);
}

7. 結論

このクイック記事では、日付を1日ずつ増やすという単純なタスクを処理するためのさまざまなアプローチについて説明しました。 JavaのコアAPIといくつかの人気のあるサードパーティのライブラリを使用してそれを実現する方法を示しました。

この記事で使用されているコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/java-dates[GitHubで利用可能]です。