2016-11-20 152 views
-2

我的代碼:不正確解析的日期

DateFormat format = new SimpleDateFormat("dd/MM/YYYY"); 

Date Today = format.parse(today); 
Date Date = format.parse(date); 

difference = (Date.getTime() - Today.getTime())/86400000; 
Math.abs(difference); 
System.out.println(String.valueOf("date" + date)); 
System.out.println(String.valueOf("date" + Date)); 
System.out.println(String.valueOf("date" + today)); 
System.out.println(String.valueOf("date" + Today)); 

輸出:
date29 /二千零十六分之十一
dateSun年12月27日00:00:00 GMT + 08:00 2015
date20/11/2016
dateSun Dec 27 00:00:00 GMT + 08:00 2015

我在解析時遇到問題日期,原始日期是29/11/2016,但是經過分析後,日期變爲Sun Dec 27 00:00:00 GMT + 08:00 2015

此問題出現在我的整個程序中,它與日期有關。

enter image description here

+2

不顯示您的代碼的屏幕截圖。將源代碼粘貼到代碼塊中的問題中。 – Andreas

+0

@Andreas完成.. –

+0

無關,但是這個'Math.abs(區別);'是NoOp。 – Henry

回答

1

格式DD/MM/YYYY應DD/MM/YYYY。請參閱SimpleDateFormat的javadoc:y = Year,Y = Week year。 - Andreas 12分鐘前

謝謝解決。

1

我知道你已經從Andreas’ comment得到了你的解決方案。我想在這裏做的是退後一步,並建議對代碼進行一些改進。隨意忽略。

  1. 最重要的,我建議你扔早已過時的類DateDateFormatSimpleDateFormat落水,並開始使用其現代的替代品。這些出現在2014年初的java.time包中。這些還提供了一種更簡單明瞭的計算差異的方法。
  2. 按照約定,變量名稱以小寫字母開頭。具體來說,在同一個源文件中使用一個名爲Date的類和名爲dateDate的兩個變量勢必造成混淆。
  3. 像亨利我也認爲你打算difference = Math.abs(difference);
  4. 您對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 ,您可以。