Joda-Time中是否有现成的方法来围绕多年?
假设你有一个DateTime startDate = 10-18-2016和一个DateTime endDate = 12-18-2017。我希望这可以长达2年。
目前,当我这样做时:
Years yearsBetween = Years.yearsBetween(startDate, endDate);
我得到年份= 1。是否有一种简单的方法可以使用Joda Time来解决这个问题,还是我需要编写一个自定义方法来处理这个问题?
答案 0 :(得分:2)
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
的结果。
仅供参考,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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:1)
在上面的评论之一中提到了这一点,并为我工作:
LocalDate startLocalDate = new LocalDate(startDate)
LocalDate endLocalDate = new LocalDate(endDate).plusYears(1).minusDays(1)
int yearsBetween = Years.yearsBetween(startLocalDate, endLocalDate).Years