2017-03-02 47 views
0

所以我使用的代碼來解析字符串日期,但它做錯了方式,所以它記錄在我的mysql數據庫中的格式錯誤。搞砸我的日期格式與java

像下面這樣: 代碼:

DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    System.out.println(new java.sql.Date(dateFormat.parse("2017-10-20").getTime())); 

輸出:

0026-04-09 

我不知道如何扭轉這種讓二零一七年十月二十日出字符串0026的-04-09

+1

爲什麼不改變日期格式爲'yyyy-MM-dd'呢? –

+0

在0026-04-09的日期試過了,它也給出了0026-04-09,問題在於我試圖扭轉我爲其他日期記錄的內容。 – CriminalDuck

+0

因此,您有'0026-04-09'你的數據庫現在並且想要修改回'2017-10-20'?是以字符串還是日期存儲?我不確定是否有防彈的方式,但有更多的信息可以更好地說明。 –

回答

1

我認爲最安全和最不復雜的方法是做wro對於可能存在於數據庫中的所有日期再次進行計算。然後你知道它們會產生什麼,你將能夠回到原來的日期。使用地圖將錯誤的日期(如DateString)映射到應該出現的日期。

我使用

import java.sql.Date; 

我也使用LocalDateMonthjava.time - 這些需要Java 8.如果您使用的是Java 7,您可以使用java.util.Calendar代替。代碼示例 - 進行調整以適應您的需求:

DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    Map<Date, Date> corrections = new HashMap<>(5500); // capacity for 11 years 
    LocalDate endDate = LocalDate.of(2020, Month.DECEMBER, 31); 
    LocalDate currentDate = LocalDate.of(2010, Month.JANUARY, 1); 

    do { 
     Date correctDate = Date.valueOf(currentDate); 
     String correctString = correctDate.toString(); 
     Date wrongDate = new Date(dateFormat.parse(correctString).getTime()); 

     if (corrections.containsKey(wrongDate)) { 
      System.out.println("Duplicate wrong date " + wrongDate); 
     } 

     corrections.put(wrongDate, correctDate); 

     currentDate = currentDate.plusDays(1); 
    } while (! currentDate.isAfter(endDate)); 

有了選擇的日期,運行上面的代碼並原因要打印的Duplicate wrong date線,所以2010至20年的時間內,我們可以轉換回明確。解脫,不是嗎?

現在你已經建立了地圖,查找方便,例如:

Date wrongDate = new Date(dateFormat.parse("2017-10-20").getTime()); // 0026-04-09 
    Date correctDate = corrections.get(wrongDate); 
    if (correctDate == null) { 
     System.out.println("Could not find correction for " + wrongDate); 
    } else { 
     System.out.println(correctDate); 
    } 

這將打印所需:

2017-10-20 

你要確保你沒有得到一個在將數值放回數據庫之前,請使用null

如果你有一個現代的JDBC驅動程序,你應該也可以在上面的代碼中避免java.sql.Date,並且使用現代的LocalDate和朋友。

+0

非常感謝!它對我有用 – CriminalDuck