1. 概述

在本教程中,我们将学习如何在Java中实现日期的加法操作,例如增加一天。在Java 8之前,Java标准日期和时间库并不是很友好。因此,在Java 8之前需要使用第三方库,Joda-Time成为了Java事实上的标准日期和时间库。

还有其他一些类和库可以用来完成这个任务,比如 java.util.Calendar 和 Apache Commons。

Java 8引入了更好的日期和时间API来解决其旧库的缺点。

因此,我们将探讨 如何使用Java 8、Joda-Time API、Java的Calendar类和Apache Commons库实现”日期增加一天“

2. Maven依赖

需要添加以下依赖到pom.xml文件中:

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

你可以在Maven 中央仓库上找到Joda-Time的最新版本,以及在Apache Commons Lang上找到最新版本。

3. 使用 java.time

java.time.LocalDate 类是一个不可变的日期时间表示,格式为"年-月-日"。

LocalDate 有许多用于日期操作的方法,可使用 plusDays() 方法实现天数+1:

public static String addOneDay(String date) {
    return LocalDate
      // 解析时间,格式 ”年-月-日“
      .parse(date)
      .plusDays(1) // 天数 +1
      .toString();
}

下面是单元测试:

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

单元测试:

@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 类有许多方法可以帮助我们正确处理日期和时间。

让我们看看如何使用它来将日期增加一天:

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

单元测试:

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

6. 使用 Apache Commons

Apache Commons 是另一个常用于日期操作(以及其他功能)的库。它是围绕 java.util.Calendarjava.util.Date 对象使用的一套实用工具。

对于我们的任务,我们可以使用 org.apache.commons.lang3.time.DateUtils 类及其 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. 总结

本文我们学习如何实现将日期”增加一天“这一简单任务,通过的不同的方法。我们展示了如何使用Java的核心API以及一些流行的第三方库来完成这个任务。

最后,本文中使用的代码示例可以在GitHub上找到