我知道你已經從Andreas’ comment得到了你的解決方案。我想在這裏做的是退後一步,並建議對代碼進行一些改進。隨意忽略。
- 最重要的,我建議你扔早已過時的類
Date
,DateFormat
和SimpleDateFormat
落水,並開始使用其現代的替代品。這些出現在2014年初的java.time
包中。這些還提供了一種更簡單明瞭的計算差異的方法。
- 按照約定,變量名稱以小寫字母開頭。具體來說,在同一個源文件中使用一個名爲
Date
的類和名爲date
和Date
的兩個變量勢必造成混淆。
- 像亨利我也認爲你打算
difference = Math.abs(difference);
。
- 您對
String.valueOf()
的調用是多餘的,只是讓代碼更難閱讀。放下它們。
爲了舉例,我在下面的代碼中建議,我故意使用不正確的日期格式模式字符串dd/MM/YYYY
。
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/YYYY");
LocalDate todayAsLocalDate = LocalDate.parse(today, format);
LocalDate dateAsLocalDate = LocalDate.parse(date, format);
difference = ChronoUnit.DAYS.between(todayAsLocalDate, dateAsLocalDate);
difference = Math.abs(difference);
System.out.println("date " + date);
System.out.println("date " + dateAsLocalDate);
System.out.println("date " + today);
System.out.println("date " + todayAsLocalDate);
System.out.println(difference);
由於代碼現在,它會拋出java.time.format.DateTimeParseException: Text '20/11/2016' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2016, MonthOfYear=11, DayOfMonth=20},ISO of type java.time.format.Parsed
。當代碼不正確時,我更喜歡對可能未被注意的不正確結果的異常。所以這比SimpleDateFormat
給你更好。
儘管消息不容易閱讀,但要注意的一點是WeekBasedYear
。以周爲基礎的年份只對週數有用,你不打算這麼做。如果與the documentation進行比較,您會發現模式中的大寫字母Y
是以周爲基準的年份,而小寫字母y
是年份。因此,讓我們糾正:
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MM/yyyy");
現在代碼打印:
date 29/11/2016
date 2016-11-29
date 20/11/2016
date 2016-11-20
9
我們注意到現代類的最後一個好處:你可以有一個日期沒有時間的日時,這就是你需要再次提供更精確地模擬您的需求的代碼,從而留下更少的混淆空間。
問題:我可以在我的Java版本中使用現代類嗎?
如果至少使用Java ,您可以。
不顯示您的代碼的屏幕截圖。將源代碼粘貼到代碼塊中的問題中。 – Andreas
@Andreas完成.. –
無關,但是這個'Math.abs(區別);'是NoOp。 – Henry