[英]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来解决这个问题,还是我需要编写一个自定义方法来处理这个问题?
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
。
仅供参考, 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 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
上面的一条评论中提到了这一点并为我工作:
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.