簡體   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