1. 概述
在本教程中,我们将探索在Java中从Date对象中减去天数的各种方法。
我们将首先使用Java 8中引入的日期时间API。然后,我们将学习如何使用java.util包中的类来实现这一点,最后,我们将借助Joda-Time库来实现同样的目的。
2. java.time.LocalDateTime
Java 8中引入的Date/Time API是目前日期和时间计算最可行的选择。
让我们看看如何从Java 8的java.util.LocalDateTime对象中减去天数:
@Test
public void givenLocalDate_whenSubtractingFiveDays_dateIsChangedCorrectly() {
LocalDateTime localDateTime = LocalDateTime.of(2022, 4, 20, 0, 0);
localDateTime = localDateTime.minusDays(5);
assertEquals(15, localDateTime.getDayOfMonth());
assertEquals(4, localDateTime.getMonthValue());
assertEquals(2022, localDateTime.getYear());
}
3. java.util.Calendar
java.util中的Date和Calendar是Java 8之前版本中最常用的日期操作实用程序类。
让我们使用java.util.Calendar从一个日期中减去5天:
@Test
public void givenCalendarDate_whenSubtractingFiveDays_dateIsChangedCorrectly() {
Calendar calendar = Calendar.getInstance();
calendar.set(2022, Calendar.APRIL, 20);
calendar.add(Calendar.DATE, -5);
assertEquals(15, calendar.get(Calendar.DAY_OF_MONTH));
assertEquals(Calendar.APRIL, calendar.get(Calendar.MONTH));
assertEquals(2022, calendar.get(Calendar.YEAR));
}
在使用时应该小心,因为它们存在一些设计缺陷并且不是线程安全的。
可以在有关迁移到新的Java 8日期时间API的文章中阅读有关与遗留代码的交互以及两个API之间的差异的更多信息。
4. Joda-Time
我们可以使用Joda-Time作为Java初始日期和时间处理解决方案的更好替代方案,该库提供了更直观的API、多种日历系统、线程安全性和不可变对象。
为了使用Joda-Time,我们需要将其作为依赖包含在pom.xml文件中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
从Joda-Time的DateTime对象中减去5天:
@Test
public void givenJodaDateTime_whenSubtractingFiveDays_dateIsChangedCorrectly() {
DateTime dateTime = new DateTime(2022, 4, 20, 12, 0, 0);
dateTime = dateTime.minusDays(5);
assertEquals(15, dateTime.getDayOfMonth());
assertEquals(4, dateTime.getMonthOfYear());
assertEquals(2022, dateTime.getYear());
}
Joda-Time对于遗留代码来说是一个很好的解决方案,但是,该项目已正式“完成”,其作者建议迁移到Java 8的Date/Time API。
5. 总结
在这篇短文中,我们探讨了从日期对象中减去天数的几种方法。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章
