Frage

Ich arbeite einen Datumswert (createWhen) von Active Directory auf nehmen und es in ein Java-Datum für die Zwecke des Erhaltens einer Liste der Konten erstellt zwischen zwei Terminen zu übersetzen. Alles funktioniert gut, außer für ein Verfahren: das Verfahren, in dem ich von dem AD-Datum an das Java-Datum gehen. Das Verfahren sieht wie folgt aus:

private Date getParsedDate(String givenString) {
    System.out.println("Value from AD is: " + givenString);
    Date parsedDate = null;
    String formattedString = this.formatDateString(givenString);
    System.out.println("Formatted String is: " + formattedString);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/DD");
    try {
        parsedDate = sdf.parse(formattedString);
        System.out.println("Final date string is: " + parsedDate.toString());
    } catch (ParseException ex) {
        ex.printStackTrace();
    }
    return parsedDate;
}

Und für ein einzelnes Stück beliebiger Daten aus AD:

Value from AD is: 20050912190509.0Z

Formatted String is: 2005/09/12

Final date string is: Wed Jan 12 00:00:00 EST 2005

Offensichtlich ist es Kommissionierung, den Tag und das Jahr korrekt (und wenn ich Stunden umfassen wählen / Minuten / Sekunden enthält es diejenigen richtig als auch), aber jedes einzelne Datum wird im Januar gestellt für aus irgendeinem Grund.

Nun, ich bin sicher, dass meine Fehler ein ziemlich einfacher, aber ich habe meine Formatierung etwa zehnmal erneut überprüft, und ich bin an dem Punkt, wo ich kann es nicht mehr sehen. Kann ein zweites Paar Augen hoffentlich meinen Code durchsehen und darauf hinweisen, wo ich falsch werde den Monat zu erhalten, so grob falsch?

Danke.

War es hilfreich?

Lösung

Ändern Sie die Musterzeichenfolge von "yyyy / MM / DD" auf "yyyy / MM / dd"

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

Andere Tipps

Stellen Sie sicher, nicht Verwendung 'mm' anstelle von 'MM' oder 'MMM'. Als kleiner m Minuten und Kappen bezeichnete bezeichnet M Monat.

TL; DR

    LocalDate parsedDate = OffsetDateTime
            .parse("20050912190509.0Z", DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SX"))
            .toLocalDate();

Dies ergibt eine LocalDate von 2005-09-12.

java.time

Ich bin dazu beitragen, die moderne Antwort. Suhas Phartale Antwort korrekt ist und war eine gute Antwort, wenn es vor 7 Jahren geschrieben wurde. Nun ist die notorisch mühsam SimpleDateFormat Klasse ist längst überholt, und wir haben so viel besser in java.time, die moderne Java-Datum und die Uhrzeit API. Ich wärmstens empfehlen Sie diese anstelle der alten Datum Zeitklassen.

Details

Es scheint aus dem Code, dass Sie Ihre Zeichenfolge von AD umformatieren, bevor es das Parsen. Es gibt keine Notwendigkeit dafür, kann die Zeichenfolge aus AD direkt analysiert werden. Wir hätten es direkt in eine LocalDate analysiert, aber ich empfehle es in ein OffsetDateTime Parsen der Zeit und aus der Zeichenfolge zu greifen; wie Sie sehen können, kann dies direkt im Anschluss an einen LocalDate umgewandelt werden. Ein LocalDate ist ein Datum ohne Uhrzeit, so dass es Ihre Anforderungen entsprechend besser als die alte Date Klasse scheint.

Der String ist in UTC (von der Z am Ende bezeichnet). Die obige Abbildung zeigt das Datum aus der Zeichenfolge, die das Datum in UTC ist. Wenn stattdessen wollten Sie das Datum in Ihrer Zeitzone war, als es September in UTC 12 19.05 war:

    LocalDate parsedDate = OffsetDateTime.parse(givenString, adDateTimeFormatter)
            .atZoneSameInstant(ZoneId.of("America/Coral_Harbour"))
            .toLocalDate();

ich gingen wir davon aus, die Formatierer ein statisches Feld deklariert haben:

private static final DateTimeFormatter adDateTimeFormatter
        = DateTimeFormatter.ofPattern("uuuuMMddHHmmss.SX");

In diesem Fall ist das Ergebnis das gleiche, für andere Zeitzonen wird es nicht sein. Bitte ersetzen Sie Ihre eigene gewünschte Zeitzone für Amerika / Coral_Harbour. Um die Zeitzoneneinstellung der JVM zu verwenden, geben Sie ZoneId.systemDefault(). Bedenken Sie jedoch, dass die Einstellung kann in der gleichen JVM durch andere Teile des Programms oder andere Programme geändert werden ausgeführt, so dass diese zerbrechlich ist.

Und der Punkt von Suhas Phartale Antwort ist gültig in java.time auch:. Formatmuster Strings Fall empfindlich sind, und ich brauchte Klein dd für Tag des Monats verwenden

Tutorial

Erfahren Sie mehr über java.time in die Oracle-Tutorial und / oder für andere suchen Ressourcen im Netz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top