Wie sollte am besten ein Datum gespeichert werden?

Diskutiere Wie sollte am besten ein Datum gespeichert werden? im Allgemeine Java-Themen Bereich.
M

MiMa

Hi,
beim Handling mit dem Datum habe ich immer wieder den Dateityp der Objektvariable von Datums geändert.
Mittlerweile habe ich schon einige Methoden zur Ausgaben (String), Auszug Jahr(in) und das Handling (Millisekunden) geschrieben und möchte es gerne etwas übersichtlicher machen weil es schon einiges an Datumsangaben sind mit denen ich arbeite.
Datumsangaben sollen neben dem Ausgeben auch verglichen werden und ebenfalls in eine MySQL Datenbank gespeichert werden.
Daher möchte ich mal nachfragen, in welchem Datentyp man ein Datum mit Uhrzeit am besten in eine Objektvariable speichert (String, Date, Millis,...) um das ständige konvertieren etwas zu minieren?

Danke
Mi
 
L

LimDul

Persönlich würde ich ein Datum mit Uhrzeit speichern, als was es ist - ein Datum mit Uhrzeit: LocalDateTime. Ich sehe da mehrere Vorteile:
Man sieht sofort, dass es ein Datum mit Uhrzeit ist. Bei einem String oder Millisekunden sieht man das dem Code nicht an. Insbesondere ein String wäre ein Graus, weil niemand garantiert dir, dass nicht irgendwo Konvertierungsfehler entstehen (Locale lässt grüßen). Insbesondere hat man mit der API von Java dann auch schon mächtiges Werkzeug für alle Operationen darauf unter korrekter Berücksichtigung solcher Dinge wie Schaltjahre, verschiedene Tage pro Monat etc. In der Datenbank wird es dann auch out of the Box als Datum mit Uhrzeit gespeichert, was damit auch Anfragen und Co es erlaubt mit dem Datum sinnvolle Abfragen zu formulieren, zu rechnen etc.

Meine Präferenz wäre:
Echtes Datumsobjekt (LocalDateTime) vor Millisekunden und das immer noch Lichtjahre vor String.
 
M

MiMa

Aktuell sind die Datumsangaben als String in den Instanzvariablen welche ich oft mit dem SimpleDateFormat in das gewandelt habe was ich halt benötigte.

Zum Prüfen habe ich eine Methode geschrieben mit einigen eigenen Untermethoden die Datums in Strings zerlegt und diese vergleicht, oder auch ein Datum auf Echtheit prüft.
Java kenne ich nicht gut genug um zu erkennen ob es da noch etwas einfacheres gibt um zwei Datums zu vergleichen und das jüngste oder das älteste heraus zu finden?

Hier ist mal ein Beispiel wie ich aus einem Datum das Jahr ermittel
Jahr ermitteln mit Strings und gibt ein int zurück
Java:
public static int sucheJahr(String datum) {
        int laenge = datum.length();
        int punkt = datum.lastIndexOf('.');
        String jahrDatum = datum.substring(punkt + 1, laenge);
        int jahr = Integer.parseInt(jahrDatum);
        return jahr;
    } // sucheJahr
Gleiche Methode, die ein String zurückgibt
Java:
public static int sucheJahr(String datum) {
        int laenge = datum.length();
        int punkt = datum.lastIndexOf('.');
        String jahr= datum.substring(punkt + 1, laenge);
        return jahr;
    } // sucheJahr
Beide Funktionieren und liefern den richtigen Wert zurück

Dann habe ich es mal mit Calendar probiert welches mir ebenfalls ein korrektes Jahr zurück lieferte, aber der Monat falsch war?
Java:
public static int sucheJahr(long datum) {
        // Last modified gibt long zurück
        Calendar kalender = Calendar.getInstance();
        kalender.setTimeInMillis(datum);
       
        int cJahr = kalender.get(Calendar.YEAR);
        int cMonat = kalender.get(Calendar.MONTH);
        int cTag = kalender.get(Calendar.DAY_OF_MONTH);
       
        LOG.info("Jahr  : " + cJahr);
        LOG.info("Monat : " + cMonat);
        LOG.info("Tag   : " + cTag);
       
        return cJahr;
    } // sucheJahr;
Hier habe ich den long wert als Parameter verwendet, weil die Methode lastModified() ein long zurück gibt.
Logausgabe des Methode sucheJahr durch die Methode mit Calendar.
Code:
2020-05-10 15:56:52 [main] INFO  Dateiarten.Datei - Das Änderungsdatum ist       : 25.09.2017
2020-05-10 15:56:52 [main] INFO  Dateiarten.Datei - *****************************************************************************
2020-05-10 15:56:52 [main] INFO  Funktionen.Datum - Jahr  : 2017
2020-05-10 15:56:52 [main] INFO  Funktionen.Datum - Monat : 8
2020-05-10 15:56:52 [main] INFO  Funktionen.Datum - Tag   : 25
Ein gutes Gefühl habe ich dann bei der Methode mit Calendar nicht.

Daher möchte ich die Datumsangaben so speichern, damit ich den großen Zirkus aufräumen und etwas vereinheitlichen kann.
 
Zuletzt bearbeitet:
L

LimDul

Deswegen nimm LocalDate bzw. LocalDateTime.

Calendar hat eine Grauenhafte API, damit wirst du nicht glücklich.

Java kenne ich nicht gut genug um zu erkennen ob es da noch etwas einfacheres gibt um zwei Datums zu vergleichen und das jüngste oder das älteste heraus zu finden?
Das geht damit ganz einfach:

Java:
LocalDate datum1 = ....;
LocalDate datum2 = ....;

if (datum1.isAfter(datum2)) { ...
}
Hier gibt es mehr Informationen zu der API :http://openbook.rheinwerk-verlag.de/java8/05_009.html

String ist die schlechteste aller Varianten (wobei die Calendar-API nicht viel besser ist ...), weil:
- in und her wandeln ist aufwendig
- Man kann nicht rechnen, man muss immer aus dem String zurückwandeln
- Wenn man nicht bei der jeder Komvertierung genau drauf achtet, auch immer das gleiche Locale mitzugeben, hat man unter Umständen auf einmal Abweichungen
- Will man eine andere Darstellung für Ausgabe muss 2x wandeln String => long => String.
 
M

MiMa

Als ich vor ein paar Jahren mit Java angefangen und mich mit Datum beschäftige, wählte ich String weil es einfach erschien.
Nach und nach stellte ich fest, das ich verschiedenes davon benötigte und konvertierte mit eigenen Methoden.
Das war aber bisher alles nicht so tragisch, da ich Java Lernte und lerne noch heute.
Ich programmierte immer aktuell benötigte kleine Module welche ich immer in der IDE ausgeführt hatte.
Es wurde aber nie ein richtiges Programm weil ich auch keine Kenntnisse über GUI Programmierung hatte.
Jetzt fange ich an, all meine kleinen Programmodule zu einem großen Programm zusammen zu fügen und erkenne jetzt das doch noch einige Änderungen anstehen.

Ich sehe, das LocalDate und LocalDateTime wesentlich komfortabler ist das Jahr zu ermitteln.
In die Instanzvariable werde ich LocalDateTime speichern damit ich das Datum und auch die Zeit habe und damit keinen Verlust der Zeit habe.
Ich sehe jetzt schon das ich auf einige meiner Methoden verzichten kann und der Code dadurch übersichtlicher wird.

Eine meiner Mammut Methoden ist das prüfen eines echten Datums.
Ich habe jetzt keine Option gefunden um dies mit LocalDateTime zu machen, gibt es da eine andere einfache Möglichkeit?

Danke
Mi
 
M

MiMa

Eine Frage taucht noch auf nachdem ich versucht habe ein LocalDateTime zu erzeugen und füllen.
Plötzlich taucht da im code folgendes auf?
new org.joda.time.LocalDateTime(i1...i5);

LocalDateTime von org.joda.time obwohl ich import java.time.LocalDateTime im Kopf implementiert habe.
Dann gibt es noch LocalDateTimeConverter von apache und javafx

Ist LocalDateTime nicht bestandteil von Java?
Zumindest steht im Doc das es Java DBase wäre?
 
mrBrown

mrBrown

LocalDateTime ist Bestandteil des JDKs. JodaTime war das "Vorbild" dafür, deshalb heißen viele Dinge gleich, nutzen solltest du aber die Klassen aus dem JDK, wenn du nicht zwingend durch andere Libs auf JodaTime angewiesen bist.
Wenn deine IDE das vorschlägt, solltest du das einfach ignorieren, und falls du ein Dependency-Management-System nutzt mal gucken, was JodaTime ins Projekt zieht.

Dann gibt es noch LocalDateTimeConverter von apache und javafx
LocalDateTimeConverter brauchst du nicht direkt nutzen, der ist zB in JavaFX für das Konvertieren von LocalDateTime <-> Text da.
(Wenn musst du einen LocalDateTimeConverter an einen JavaFX-Komponente übergeben, selber konvertieren solltest du damit aber nicht müssen.
 
Thema: 

Wie sollte am besten ein Datum gespeichert werden?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben