Java 中对 Date 做加减操作

原文

不全是翻译,只是介绍原文的方法

概览

本文主要讲述 Java 8 之后,对 java.time.LocalDateTime 等对象的时间加减操作

java.util.Date

Java 7 之前,可以使用 java.util.Date 和 java.util.Calendar 来进行操作

public Date addHoursToJavaUtilDate(Date date, int hours) {
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
  // Calendar.HOUR_OF_DAY 是 24 小时制
  calendar.add(Calendar.HOUR_OF_DAY, hours);
  return calendar.getTime();
}
复制代码

Java 8 之后,可以通过 java.time.Instant 作为桥梁来做转换

@Test
public void givenJavaUtilDate_whenUsingToInstant_thenAddHours() {
  Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0)
    .getTime();
  Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0)
    .getTime();

  assertThat(Date.from(actualDate.toInstant().plus(Duration.ofHours(2))))
    .isEqualTo(expectedDate);
}
复制代码

java.time.LocalDateTime/ZonedDateTime

Java 8 之后,java.time.LocalDateTime or java.time.ZonedDateTime 可以直接进行加减操作 加:plusHours

@Test
public void givenLocalDateTime_whenUsingPlusHours_thenAddHours() {
  LocalDateTime actualDateTime = LocalDateTime
    .of(2018, Month.JUNE, 25, 5, 0);
  LocalDateTime expectedDateTime = LocalDateTime.
    of(2018, Month.JUNE, 25, 10, 0);

  assertThat(actualDateTime.plusHours(5)).isEqualTo(expectedDateTime);
}
复制代码

减:minusHours

@Test
public void givenLocalDateTime_whenUsingMinusHours_thenSubtractHours() {
  LocalDateTime actualDateTime = LocalDateTime
    .of(2018, Month.JUNE, 25, 5, 0);
  LocalDateTime expectedDateTime = LocalDateTime
    .of(2018, Month.JUNE, 25, 3, 0);
  
  assertThat(actualDateTime.minusHours(2)).isEqualTo(expectedDateTime);

}
复制代码

java.time.Instant

如前文所述,java.time.Instant 也可以直接进行加减操作

@Test
public void givenInstant_whenUsingAddHoursToInstant_thenAddHours() {
  Instant actualValue = Instant.parse("2018-06-25T05:12:35Z");
  Instant expectedValue = Instant.parse("2018-06-25T07:12:35Z");

  assertThat(actualValue.plus(2, ChronoUnit.HOURS))
    .isEqualTo(expectedValue);
}
复制代码

Apache Commons DateUtils

Apache 的 DateUtils 类库中提供,addHours 的静态方法

@Test
public void givenJavaUtilDate_whenUsingApacheCommons_thenAddHours() {
  Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0)
    .getTime();
  Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0)
    .getTime();

  assertThat(DateUtils.addHours(actualDate, 2)).isEqualTo(expectedDate);
}
复制代码

Joda Time

Joda Time 可以替代 Java 8 DateTime API 并提供自己的实现

@Test
public void givenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours() {
  DateTime actualDateTime = new DateTime(2018, 5, 25, 5, 0);
  DateTime expectedDateTime = new DateTime(2018, 5, 25, 7, 0);

  assertThat(actualDateTime.plusHours(2)).isEqualTo(expectedDateTime);
}
复制代码

官方文档

猜你喜欢

转载自juejin.im/post/5e7f2c18e51d4546f940a672