[英]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.