繁体   English   中英

如何在Joda-Time中完成多年

[英]How to Round Up Years in Joda-Time

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

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

目前,当我这样做时:

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

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

TL;博士

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

半开

Joda-Time使用Half-Open方法跨越时间,其中开头是包容性的 ,结尾是独占的 所以一年从有问题的一年的1月1日开始,一直到第二年的1月1日,但不包括在内。

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

我们转换为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项目现在处于维护模式 ,团队建议迁移到java.time类。

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

通过这里的Zdt ,我可以参考你手头的ZonedDateTime对象。 此类表示特定时区( ZoneId )中时间轴上的时刻,分辨率为纳秒。 ZonedDateTime对象,我们转换为LocalDate ,然后应用一对TemporalAdjuster对象移动到一年中的第一年和下一年。

LocalDate start = yourStartingZdt.toLocalDate().with( TemporalAdjusters.firstDayOfYear() );
LocalDate stop = yourEndingZdt.toLocalDate().with( TemporalAdjusters.firstDayOfNextYear() );

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

或者,我们可以通过Period类获得年数。

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

Period p = Period.between( start , stop );
int years = p.getYears();

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

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM