2017-03-02 6 views
0

So verwende ich einen Code, um Strings bis heute zu analysieren, aber tat es falsch, so wurde es in meinem mysql-Datenbank in einem falschen Format aufgezeichnet.vermasselt meine Datumsformatierung mit Java

wie folgt aus: dem Code:

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

Ausgang:

0026-04-09 

Ich frage mich, wie man das Reverse 2017.10.20 aus dem String-0026 zu erhalten -04-09

+1

Warum wechseln Sie nicht einfach das Datumsformat um, yyyy-MM-dd'? –

+0

versuchte es am Tag 0026-04-09, es gibt 0026-04-09 auch, das Problem ist, ich versuche umzukehren, was ich für die anderen Daten auch notierte – CriminalDuck

+0

So haben Sie '0026-04-09' in Ihre Datenbank jetzt und möchte sie bis zum '2017-10-20' korrigieren? Wird das als String oder als Datum gespeichert? Ich bin mir nicht sicher, ob es einen kugelsicheren Weg gibt, aber mit einigen weiteren Informationen können wir es besser sagen. –

Antwort

1

Ich denke, der sicherste und am wenigsten komplizierte Weg ist, die Wro zu tun erneut Berechnungen für alle Daten durchführen, die möglicherweise in Ihrer Datenbank vorhanden sind. Dann wissen Sie, was sie nachgeben, und Sie können zu dem Zeitpunkt zurückkehren, an dem das Datum hätte sein sollen. Verwenden Sie eine Karte, um vom falschen Datum (wie Date oder als String) auf die Karte zu mappen, die es hätte sein sollen.

ich

bin mit
import java.sql.Date; 

ich auch bin mit LocalDate und Month von java.time - diese benötigen Java 8. Wenn Sie Java 7 verwenden, Sie java.util.Calendar stattdessen verwenden können. Code-Beispiel - auf auf Ihre Bedürfnisse zugeschnitten werden:

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)); 

Mit dem gewählten Zeitraum, wird den obigen Code ausgeführt werden nicht Ursache der Duplicate wrong date Zeile gedruckt werden, so dass innerhalb des Intervalls 2010-2020 wir zurück konvertieren eindeutig. Eine Erleichterung, nicht wahr?

Jetzt können Sie die Karte erstellt haben, ist die Suche einfach, zum Beispiel:

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); 
    } 

Dies druckt die gewünschte:

2017-10-20 

Sie wollen sicherstellen, dass Sie eine nicht bekommen null bevor Sie den Wert zurück in Ihre Datenbank setzen.

Wenn Sie einen modernen JDBC-Treiber haben, sollten Sie auch in der Lage sein, java.sql.Date im obigen Code zu vermeiden und die modernen LocalDate und Freunde den ganzen Weg durch zu verwenden.

+0

Vielen Dank! es funktioniert für mich – CriminalDuck