如何在Joda-Time中完成多年

时间:2016-10-18 22:31:27

标签: java date datetime rounding jodatime

Joda-Time中是否有现成的方法来围绕多年?

假设你有一个DateTime startDate = 10-18-2016和一个DateTime endDate = 12-18-2017。我希望这可以长达2年。

目前,当我这样做时:

Years yearsBetween = Years.yearsBetween(startDate, endDate);

我得到年份= 1。是否有一种简单的方法可以使用Joda Time来解决这个问题,还是我需要编写一个自定义方法来处理这个问题?

2 个答案:

答案 0 :(得分:2)

TL;博士

  • 将开始日期移至年初。
  • 将结束日期移至 年后的第一个

半开

Joda-Time使用半开放方法跨越时间,其中开头是包含,结尾是独占。因此,一年从有关年份的1月1日开始,一直到第二年的1月1日,但不包括在内。

因此,您希望2016-2017中的日期为两年,将开始日期移至一年的第一天,并将结束日期移至 年后的第一年。< / p>

我们转换为LocalDate因为我们不关心这个年度计算的时间。

LocalDate start = startDate.toLocalDate().withDayOfMonth( 1 ).withMonthOfYear( 1 );  // Move to first of same year.
LocalDate stop = endDate.toLocalDate().withDayOfMonth( 1 ).withMonthOfYear( 1 ).plusYears(1);  // Move to first of *following* year.

然后使用Years执行相同的计算。

Years yearsBetween = Years.yearsBetween( start , stop );  // Half-Open, beginning is inclusive while ending is exclusive.
int years = yearsBetween.getYears();  // Plain integer.

2016年(移至2016-01-01)和2017年(移至2018-01-01)的任何日期2的结果。

java.time

仅供参考,Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time课程。

这项工作在java.time中稍微简单一些。 TemporalAdjuster接口提供了操作日期时间值的类。 TemporalAdjusters类(注意复数s)提供了几种实现。这些规定可以获得一年中的第一年和明年的第一年。

在此处Zdt,我指的是您可能拥有的ZonedDateTime个对象。此类表示特定时区(ZoneId)中时间轴上的时刻,分辨率为纳秒。从我们转换为ZonedDateTime的{​​{1}}对象开始,然后应用一对LocalDate对象移至年初和次年。

TemporalAdjuster

java.time类不包含Joda-Time Years类的等价物。如果需要,您可以将ThreeTen-Extra项目添加到您的应用程序,以使用包含Years类的其他类扩展java.time。

或者,我们可以通过LocalDate start = yourStartingZdt.toLocalDate().with( TemporalAdjusters.firstDayOfYear() ); LocalDate stop = yourEndingZdt.toLocalDate().with( TemporalAdjusters.firstDayOfNextYear() ); 课程获得年数。

与Joda-Time一样,包括Period在内的java.time类使用半开放方法来跨越时间。我建议您在所有日期工作中始终如一地使用Half-Open,因为它会使您的代码更简单,更不容易出错。

Period

2016年(移至2016-01-01)和2017年(移至2018-01-01)的任何日期Period p = Period.between( start , stop ); int years = p.getYears(); 的结果。

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

在上面的评论之一中提到了这一点,并为我工作:

LocalDate startLocalDate = new LocalDate(startDate)
LocalDate endLocalDate = new LocalDate(endDate).plusYears(1).minusDays(1)

int yearsBetween = Years.yearsBetween(startLocalDate, endLocalDate).Years