2017-10-28 6 views
-2

Ich habe jetzt fast 6 Stunden damit gespielt und habe mir andere Fragen angesehen, aber ich kann nicht herausfinden, was ich falsch mache, was mir diese seltsamen Ergebnisse gibt. Hier ist mein Code untenDateFormat.parse() gibt falsches Ergebnis

String dateStr = "20171230"; 
    StringBuilder sb = new StringBuilder(); 
    sb.append(dateStr.subSequence(0, 4)) 
     .append("/") 
     .append(dateStr.substring(4,6)) 
     .append("/") 
     .append(dateStr.substring(6,8)); 

    dateStr = sb.toString(); 

    System.out.println("date string is " + dateStr); 

    DateFormat df = new SimpleDateFormat("yyyy/mm/dd"); 

    df.setLenient(false); 

    Date Date = null; 

    try { 
     Date = df.parse(dateStr); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println("Date is " + Date); 

Ausgang

date string is 2017/12/30 
Date is Mon Jan 30 00:12:00 CST 2017 

Das Datum sollte 30. Dezember, nicht 30. Januar Kann mein jemand sagen, warum dies geschieht.

Antwort

2

Das Format, an dem Sie ein einfaches Datumsformat übergeben haben, hat Minuten definiert, in denen Sie den Monat vermuten.

Beachten Sie, wie die Zeitausgabe zu 00:12 eingestellt ist.

Verwenden Sie stattdessen yyyy/MM/dd

1

Lassen Sie mich ein paar Anregungen geben, die ein wenig über genau gehen, was über Sie gefragt. Ich denke, meine Vorschläge sollten hilfreich sein.

Zunächst sollten Sie sich nicht an die lange veralteten Klassen Date und SimpleDateFormat halten. The modern Java date and time API ist im Allgemeinen viel angenehmer zu arbeiten und enthält weniger unangenehme Überraschungen. Es ist als JSR-310 oder java.time bekannt.

Zweitens sollte es nicht notwendig sein, Ihre Zeichenfolge mit einem StringBuilder neu zu formatieren, bevor Sie das Datum daraus extrahieren. 20171230 kann direkt in ein Datum geparst werden. Noch schlimmer, die Art, wie Sie die Zeichenkette konvertieren, Sie validieren nicht die Länge: Wenn es statt 8 9 Ziffern gäbe, möchten Sie es fangen und eine Ausnahme auslösen, aber Ihr Code nimmt nur die ersten 8 Ziffern und ignoriert, wenn es mehr gibt.

Schließlich, wie Trenton Trama bereits in the other answer hingewiesen, Format-Muster-Zeichenfolgen Groß-und Kleinschreibung. Es spielt eine Rolle, ob und wo Sie Groß- oder Kleinbuchstaben verwenden. Die Verwendung des falschen Falls führt höchstwahrscheinlich zu falschen Ergebnissen. Dies gilt sowohl für die veraltete als auch die moderne API. Glücklicherweise, wenn es um das Parsen geht, neigt die moderne API viel eher dazu, eine Ausnahme zu erzeugen, wenn Sie den falschen Fall verwenden, damit Sie zumindest informiert werden, dass etwas nicht stimmt.

Und schließlich - wenn Sie möchten, dass jemand anderes Ihren Code liest, wie andere Stackoverflowers, verwenden Sie die Codierungskonventionen, um uns zu helfen. Variablennamen beginnen mit einem Kleinbuchstaben. Es ist besonders verwirrend, wenn Sie eine Klasse mit dem Namen Date und eine Variable mit dem Namen Date haben.

Die oben genannten Beträge bis zu:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMdd"); 
    String dateStr = "20171230"; 
    LocalDate date = LocalDate.parse(dateStr, dtf); 
    System.out.println("Date is " + date); 

Ausgang ist:

Date is 2017-12-30 

Frage: Kann ich die moderne API mit meiner Java-Version verwenden?

Wenn mindestens Java verwenden, Sie können.