Java 8計算兩個日期之間的月份

      網友投稿 890 2022-05-30

      開始日期:“2021-08-31”

      結束日期:“2021-11-30”

      在上述兩個日期之間的91天持續時間,期望代碼返回3個月的持續時間,但是以下方法僅返回2個月。這是Java 8中的bug 嗎?日期為91天,卻僅返回2個月。

      Period diff = Period.between(LocalDate.parse("2021-08-31"), LocalDate.parse("2021-11-30"));

      long daysBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2021-08-31"), LocalDate.parse("2021-11-30"));

      我嘗試使用Joda庫而不是Java 8 API,它可以工作。它會返回3,看起來Java持續時間的月份計算也使用了天數。

      LocalDate dateBefore= LocalDate.parse("2016-08-31"); LocalDate dateAfter = LocalDate.parse("2016-11-30"); int months = Months.monthsBetween(dateBefore, dateAfter).getMonths(); System.out.println(months);

      但我就想用 JDK 的 API。因此仍在尋找其他解決方案。

      由于僅需要兩個日期之間的月份數,請使用期間的文檔來調整日期,如Jacob所述使用日期。只需將兩個實例的日期設置為相同的值(每月的第一天)

      Period diff = Period.between( LocalDate.parse("2021-08-31").withDayOfMonth(1), LocalDate.parse("2021-11-30").withDayOfMonth(1)); System.out.println(diff); //P3M

      與其他解決方案相同:

      long monthsBetween = ChronoUnit.MONTHS.between( LocalDate.parse("2021-08-31").withDayOfMonth(1), LocalDate.parse("2021-11-30").withDayOfMonth(1)); System.out.println(monthsBetween); //3

      Period#between的文檔指出以下內容:

      The start date is included, but the end date is not.

      此外:

      A month is considered if the end day-of-month is greater than or equal to the start day-of-month.

      Java 8計算兩個日期之間的月份

      你的月底結束日期30不大于或等于您的月底開始日期31,因此不考慮第三個月。

      注意參數名稱:

      public static Period between?(LocalDate startDateInclusive, LocalDate endDateExclusive)

      要返回3個月,您可以將endDateExclusive增加一天。

      因此,最好調整實施方式,使結束日期包括在內并獲得所需的結果

      Period diff = Period.between(LocalDate.parse("2016-08-31"), LocalDate.parse("2016-11-30").plusDays(1)); System.out.println("Months :" + diff.getMonths()); //Output -> Months : 3

      向后兼容較舊的JDK 版本

      public static int monthsBetween(Date d1, Date d2){ if(d2==null || d1==null){ return -1;//Error } Calendar m_calendar=Calendar.getInstance() m_calendar.setTime(d1); int nMonth1=12*m_calendar.get(Calendar.YEAR)+m_calendar.get(Calendar.MONTH); m_calendar.setTime(d2); int nMonth2=12*m_calendar.get(Calendar.YEAR)+m_calendar.get(Calendar.MONTH); return java.lang.Math.abs(nMonth2-nMonth1); }

      永遠不要使用LocalDateTime來計算兩個日期之間的月份,結果奇怪且不正確,請始終使用LocalDate!

      import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; public class TestMonthsDateTime { public static void main(String[] args) { /**------------------Date Time----------------------------*/ LocalDateTime t1 = LocalDateTime.now(); LocalDateTime t2 = LocalDateTime.now().minusMonths(3); long dateTimeDiff = ChronoUnit.MONTHS.between(t2, t1); System.out.println("diff dateTime :" + dateTimeDiff); //diff dateTime : 2 /**-------------------------Date----------------------------*/ LocalDate t3 = LocalDate.now(); LocalDate t4 = LocalDate.now().minusMonths(3); long dateDiff = ChronoUnit.MONTHS.between(t4, t3); System.out.println("diff date :" + dateDiff);//diff date : 3 } }

      private static long durationMonths(LocalDate dateBefore, LocalDate dateAfter) { System.out.println(dateBefore+" "+dateAfter); if (dateBefore.getDayOfMonth() > 28) { dateBefore = dateBefore.minusDays(5); } else if (dateAfter.getDayOfMonth() > 28) { dateAfter = dateAfter.minusDays(5); } return ChronoUnit.MONTHS.between(dateBefore, dateAfter); }

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:本地與服務器執行結果不同的一種情況——格式化日期未設定區域
      下一篇:【Android 安裝包優化】資源混淆 ( 資源混淆效果 | APK 構建流程簡介 | 資源 ID 組成 )
      相關文章
      久久夜色精品国产亚洲av| 国产偷国产偷亚洲高清在线 | 亚洲综合小说久久另类区| 丁香亚洲综合五月天婷婷| 亚洲中文无码卡通动漫野外| 99人中文字幕亚洲区| 亚洲嫩模在线观看| 亚洲国产成人精品无码区在线观看| 国产成人综合亚洲| 亚洲第一页综合图片自拍| 天堂亚洲免费视频| vvvv99日韩精品亚洲| 亚洲AⅤ无码一区二区三区在线| 人人狠狠综合久久亚洲高清| 亚洲国产高清精品线久久| 亚洲天堂免费在线视频| 精品国产亚洲一区二区在线观看 | 自怕偷自怕亚洲精品| 亚洲黄色片在线观看| 亚洲精品在线免费观看| 日本亚洲成高清一区二区三区| 亚洲精品国产成人片| 精品国产综合成人亚洲区| 亚洲av中文无码乱人伦在线r▽| 久久久久亚洲精品美女| 中文字幕亚洲免费无线观看日本| 久久亚洲AV成人出白浆无码国产| 亚洲精品第一国产综合精品 | 亚洲欧洲精品成人久久曰影片 | 亚洲男女一区二区三区| 亚洲av永久综合在线观看尤物| 亚洲成年网站在线观看| 亚洲AV无码专区在线观看成人| 国产亚洲日韩在线a不卡| 亚洲av成人无码久久精品| 亚洲国产精品国自产电影| 亚洲精品熟女国产| 亚洲男人天堂2018av| 朝桐光亚洲专区在线中文字幕| 亚洲七七久久精品中文国产| 亚洲精品自产拍在线观看|