SimpleDataFormat.format() spuckt falsches Jahr aus (statt 1999 = 3899)

Hag2bard

Bekanntes Mitglied
Hallo,

ich bin gerade dabei etwas über JAXB (XML Binding) zu lernen und habe bisher folgendes Beispiel aufgebaut:

Duke.java

In dieser Klasse habe ich an dem Feld publishingDate eine Annotation gesetzt, welche mir mit Hilfe eines DateAdapters das Datum in ein lesbares Format umwandelt.
Java:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Date;

@XmlRootElement                         //Markiert Java Klasse als Root Element
@XmlAccessorType(XmlAccessType.FIELD)   //Stellt AccessorType auf Felder der Klasse (XML-Datenbindung)
public class Duke {
    @XmlElement(name = "Sprache")
    private String language;                //Feld für Serialisierung
    @XmlElement(name = "Erscheinungsdatum")
    @XmlJavaTypeAdapter(DateAdapter_yyyyMMdd.class)
    private Date publishingDate;             //Feld für Serialisierung
    @XmlElement(name = "Objektorientiert")
    private ObjectOriented objectOriented;  //Feld für Serialisierung

    public Duke() {                         //Standard-Konstruktor
    }

    public Duke(String language, Date publishingDate, ObjectOriented objectOriented) {     //Konstruktor
        this.language = language;
        this.publishingDate = publishingDate;
        this.objectOriented = objectOriented;
    }

    @Override
    public String toString() {          //Überschriebene toString Methode für die Testmethode des Parsens
        return "Duke{" + "Sprache=" + language + ", Erscheinungsjahr=" + publishingDate + ", Objektorientiert=" + objectOriented + '}';
    }


    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public Date getPublishingDate() {
        return publishingDate;
    }

    public void setPublishingDate(Date publishingDate) {
        this.publishingDate = publishingDate;
    }

    public ObjectOriented isObjectOriented() {
        return objectOriented;
    }

    public void setObjectOriented(ObjectOriented objectOriented) {
        this.objectOriented = objectOriented;
    }
}


DateAdapter_yyyyMMdd.java
Hier setze ich in der Marshal-Methode nochmal Testweise das Jahr auf 1990.
Java:
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateAdapter_yyyyMMdd extends XmlAdapter<String, Date> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd");

    public DateAdapter_yyyyMMdd() {
    }

    @Override
    public String marshal(Date date) {
        date.setYear(1990);
        return this.dateFormat.format(date);
    }

    @Override
    public Date unmarshal(String s) throws Exception {
        return this.dateFormat.parse(s);
    }


}


Und meine TestKlasse DukeTest.java
Java:
import org.junit.Before;
import org.junit.Test;

import javax.xml.bind.*;
import java.io.File;
import java.util.Calendar;
import java.util.Date;

public class DukeTest {
    private JAXBContext context;

    /**
     * Die mit @Before annotierte Methode init() initialisiert ein JAXBContext anhand der übergebenen Instance der Duke-Klasse.
     *
     * @throws JAXBException
     */
    @Before
    public void init() throws JAXBException {
        this.context = JAXBContext.newInstance(Duke.class);
    }

    /**
     * Die Serialization Methode erstellt ein neues Marshaller-Objekt aus dem JAXBContext der Duke Klasse.
     * Anschließend wird die marshall()-Methode aufgerufen, welche als Parameter ein Duke-Objekt sowie ein File Objekt übergeben bekommt.
     *
     * @throws JAXBException
     */
    @Test
    public void serialization() throws JAXBException {
        Marshaller marshaller = this.context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);                    //Formatierter Output der xml Datei
        marshaller.marshal(new Duke("C++", new Date(1990, Calendar.DECEMBER, 31), ObjectOriented.Ja), new File("duke.xml"));
    }

    /**
     * Die Parsing Methode erstellt ein neues Unmarshaller-Objekt aus dem JAXBContext der Duke Klasse.
     * Anschließend wird ein Java-Object deklariert, welches durch die unmarshal()-Methode initialisiert wird.
     * Zum Schluss wird mit einem einfachen sysout das Java Objekt ausgegeben. (toString()-Methode)
     *
     * @throws JAXBException
     */
    @Test
    public void parsing() throws JAXBException {
        Unmarshaller unmarshaller = this.context.createUnmarshaller();
        Object unmarshalled = unmarshaller.unmarshal(new File("duke.xml"));
        System.out.println("unmarshalled = " + unmarshalled);
        Duke duke = (Duke) unmarshalled;
        System.out.println("Programmiersprache: " + duke.getLanguage());
        System.out.println("ist Objektorientiert: " + duke.isObjectOriented());
        System.out.println("Erscheinungsjahr: " + duke.getPublishingDate().getYear());
    }
}


Dabei kommt aber in der XML folgendes bei raus:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<duke>
    <Sprache>C++</Sprache>
    <Erscheinungsdatum>3899_12_31</Erscheinungsdatum>
    <Objektorientiert>Ja</Objektorientiert>
</duke>

Kann mir jemand erklären, wieso das der Fall ist?
Bitte kein Hinweis bezüglich dessen, dass ich deprecated-Sachen benutze, darum geht es mir zumindest im Moment noch nicht.

Danke im Voraus
 
Zuletzt bearbeitet:

Hag2bard

Bekanntes Mitglied
Also muss ich das in meiner unmarshal Methode mit berücksichtigen, so wie ich es in der Marshal Methode berücksichtigt habe?
Java:
    @Override
    public String marshal(Date date) {
        date.setYear(date.getYear()-1900);
        return this.dateFormat.format(date);
    }

Ich verstehe den Sinn nicht, wieso das +1900 gerechnet wird.
 

KonradN

Super-Moderator
Mitarbeiter
Neun, wenn du das alte Date API nutzen willst, dann musst du es entsprechend der Dokumentation nutzen. Und das Jahr wird immer mit -1900 angegeben. Wenn du also das Jahr 1990 haben willst, dann musst du Date ein 90 übergeben.

Bezüglich deprecated Methoden wolltest du aber nichts hören … also wenn du mir Sch…. spielen willst, dann wunder Dich nicht, wenn du entsprechend stinkst.
 

Hag2bard

Bekanntes Mitglied
Neun, wenn du das alte Date API nutzen willst, dann musst du es entsprechend der Dokumentation nutzen. Und das Jahr wird immer mit -1900 angegeben. Wenn du also das Jahr 1990 haben willst, dann musst du Date ein 90 übergeben.

Bezüglich deprecated Methoden wolltest du aber nichts hören … also wenn du mir Sch…. spielen willst, dann wunder Dich nicht, wenn du entsprechend stinkst.
Guter Spruch :D, leider bin ich darauf angewiesen mit der Sch... von anderen zu spielen. Ich muss anhand eines existierenden Beispiels JAXB erläutern und habe gerade dank dir entdeckt, dass dieser Fallstrick in dem Code nicht berücksichtigt wird :D
 

KonradN

Super-Moderator
Mitarbeiter
Guter Spruch :D, leider bin ich darauf angewiesen mit der Sch... von anderen zu spielen. Ich muss anhand eines existierenden Beispiels JAXB erläutern und habe gerade dank dir entdeckt, dass dieser Fallstrick in dem Code nicht berücksichtigt wird :D
Sehr gerne. Das Problem ist halt, dass die alte date/time API viele Probleme oder Fallstricke hatte. Teilweise wurden dann Teile deprecated gemacht (so wie bei setDate und den verwendeten Konstruktoren) um da erst einmal die gröbsten Schnitzer (so nenne ich die einfach einmal) zu deaktivieren. Aber durch die neue API wurde das Problem dann letztendlich gelöst. Und ab Java 8 steht die zur Verfügung und man sollte versuchen, darauf zu wechseln, wenn irgendwie möglich. Siehe dazu z.B. einmal https://www.baeldung.com/java-8-date-time-intro.

Aber wenn man da noch gezwungen sein sollte, die alte API zu nutzen, dann ist das leider nur ein Ausblick, wo man evtl. irgendwann mal hin kommen könnte. Oder um bei den Visuellen Vergleichen zu bleiben: Wenn die Firma nun einmal "Wasser, Gas, Sch...." macht (frei nach Werner), dann gehört das halt mit zum Job :)
 

Neumi5694

Top Contributor
Ich weiß, der Post ist schon etwas älter uind das hier trägt zu keiner Lösung bei, wollte nur noch anmerken, dass der OP nicht der einzige ist, der damit Probleme hat:
cleo.jpg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
berserkerdq2 Wie datum im default format speichern? Java Basics - Anfänger-Themen 5
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
A Out.format problem. Java Basics - Anfänger-Themen 3
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
W OOP Objektorientiert: Darstellung von Uhrzeiten im 24-Stunden-Format Java Basics - Anfänger-Themen 15
L Java Date Format ändern Java Basics - Anfänger-Themen 5
M JSON Format Java Basics - Anfänger-Themen 5
B Schleife erstellen mit String Format "001" bis "999" Java Basics - Anfänger-Themen 2
N jodaTime java.lang.IllegalArgumentException: Invalid format Java Basics - Anfänger-Themen 3
V Datentypen Richtiges Format abspeichern Java Basics - Anfänger-Themen 13
F JSON in dokumentierten Format als PDF Java Basics - Anfänger-Themen 3
J Jar Format Java Basics - Anfänger-Themen 4
J Programm im Jar-Format funktioniert nicht richtig Java Basics - Anfänger-Themen 9
I A0-Format in jpanel anzeigen Java Basics - Anfänger-Themen 1
M Variablen Ausgabe bei System.out.format? Java Basics - Anfänger-Themen 3
M String.format Java Basics - Anfänger-Themen 3
S Fehlermeldung bei format methode Java Basics - Anfänger-Themen 1
L Java Format Strings Java Basics - Anfänger-Themen 2
S String.format Fehler Java Basics - Anfänger-Themen 12
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
C Welches Format gibt Java aus? Java Basics - Anfänger-Themen 5
G String auf Format prüfen Java Basics - Anfänger-Themen 3
A String auf Format überprüfen Java Basics - Anfänger-Themen 7
U String.format (%s, %d) für Nummern Java Basics - Anfänger-Themen 37
L Erste Schritte int-Format Java Basics - Anfänger-Themen 5
N Change date Format Java Basics - Anfänger-Themen 2
T String.format Exception Java Basics - Anfänger-Themen 7
M Simple Date Format Java Basics - Anfänger-Themen 2
C string-Format Java Basics - Anfänger-Themen 6
O Tabelle Formatieren mit system.out.format Java Basics - Anfänger-Themen 11
Z System.out.format, Hilfe. Java Basics - Anfänger-Themen 14
H format() - methode Java Basics - Anfänger-Themen 2
L X509 Zertifikat in PKCS#7 Format Java Basics - Anfänger-Themen 2
K Methoden format() mit Point(x, y)-Objekt Java Basics - Anfänger-Themen 14
M Zeit von microsekunden auf Format mm:ss Java Basics - Anfänger-Themen 13
E formartierte Aussgabe mit JTextPane und String.format Java Basics - Anfänger-Themen 5
J java.util.format => mit String? Java Basics - Anfänger-Themen 2
Spin System.out.format Java Basics - Anfänger-Themen 2
N Datumseingabe im bestimmtem Format Java Basics - Anfänger-Themen 16
T scanner bestimmtes format abfragen Java Basics - Anfänger-Themen 5
D Bytes für WAV Format anpassen Java Basics - Anfänger-Themen 5
K Double Format Java Basics - Anfänger-Themen 4
-horn- Wie am Einfachsten mit Config-Datei umgehen. Welches Format? Java Basics - Anfänger-Themen 6
T Umwandeln in .jar - Format Java Basics - Anfänger-Themen 2
B Datumsstring umwandeln in richtiges dd.mm.yyyy format? Java Basics - Anfänger-Themen 2
R String.format() funktioniert nicht Java Basics - Anfänger-Themen 2
G String in Date Format umwandeln Java Basics - Anfänger-Themen 8
M String.format() max. Spaltenbreite Java Basics - Anfänger-Themen 2
G Time-Format-Klasse ode so Java Basics - Anfänger-Themen 2
P e-format Java Basics - Anfänger-Themen 5
H Format des Datums in Logdatei Java Basics - Anfänger-Themen 2
M Festes Format bei der Ausgabe einhalten! Java Basics - Anfänger-Themen 4
S long millisekunden nach Uhrzeit format Java Basics - Anfänger-Themen 5
S Java 1.5 System.out.format() Java Basics - Anfänger-Themen 2
R Alternative zu "Format" in Java 1.4 Java Basics - Anfänger-Themen 3
R Java 5.0 / String.format - Warning Java Basics - Anfänger-Themen 8
G Zeit auslesen in bestimmtem Format Java Basics - Anfänger-Themen 2
X Dezimal/-Hexcode in lebares format umwandeln Java Basics - Anfänger-Themen 4
V String Format Java Basics - Anfänger-Themen 4
B welches format hat java.sql.date? Java Basics - Anfänger-Themen 9
G format für int Java Basics - Anfänger-Themen 10
B Integer format bestimmen Java Basics - Anfänger-Themen 2
D Arrays.toString spuckt null aus? Java Basics - Anfänger-Themen 3
V Arrays aus eigener Klasse erstellt, zuweisung aber spuckt Fehler in verbindung mit main Methode aus. Java Basics - Anfänger-Themen 3
R Nach Ubuntu-Update: Konsole spuckt bei neu Kompilierten Programmen Fehler aus (BlueJ)(Ubuntu12.04) Java Basics - Anfänger-Themen 11
M Java spuckt Exeption bei Array aus Java Basics - Anfänger-Themen 2
C ok... der spuckt irgendwie nur komische zeichen aus.... Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben