不全是翻译,只是介绍原文的方法
概览
本文主要讲述 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);
}
复制代码