web-dev-qa-db-fra.com

Date vs TimeStamp vs calendrier?

Je suis parfois dérouté par les différents types de date en Java et leur utilisation pratique. Ici j'essaye de résumer ma compréhension

Java.sql.Date :- Un wrapper mince autour d'une valeur en millisecondes qui permet à JDBC de l'identifier en tant que valeur SQL DATE

Java.sql.Timestamp :- Un wrapper mince autour de Java.util.Date qui permet à l'API JDBC de l'identifier comme une valeur SQL TIMESTAMP. Il ajoute la possibilité de conserver la valeur de fraction de seconde SQL TIMESTAMP en permettant la spécification de fraction de seconde avec une précision de nanosecondes.

J'ai vu la plupart des projets préférer l'horodatage à la date. Je pense que la raison principale en est que Timestamp peut conserver la valeur jusqu'à une précision en nano secondes alors que Data peut conserver jusqu'à plusieurs millisecondes. Correct?

Calendar :- Cette classe est conçue pour la manipulation de date, par exemple: - pour convertir un instant donné en un moment donné en un ensemble de champs de calendrier tels que YEAR, MONTH, DAY_OF_MONTH, HOUR, etc., et pour manipuler les champs de calendrier, tels que Bien que je ne sache pas pourquoi cette classe est abstraite alors qu’une seule implémentation existe, c’est-à-dire GregorianCalendar.

12
M Sach

Java.sql.Timestamp Une mince enveloppe autour de Java.util.Date qui permet à l'API JDBC de l'identifier comme une valeur SQL TIMESTAMP.

Si vous cochez Java.sql.Timestamp JavaDoc , il est très explicite que cette classe étend à partir de Java.util.Date (en tant que Java.sql.Date fait). Et dans les projets du monde réel, vous devez utiliser Java.util.Date lorsque vous stockez les données dans votre base de données, et principalement à Java.sql.Timestamp car il stocke les valeurs de date et d'heure, alors que Java.sql.Date ne stocke que les valeurs de date.

De plus, Java.util.Calendar est abstrait puisqu'il y a plus d'implémentations de ceci en dehors de Java.util.GregorianCalendar. Si vous voyez le code Calendar#getInstance de HotSpot, vous verrez qu'il appelle createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT)), et ce code de méthode utilise 3 calendriers différents: BuddhistCalendar , JapaneseImperialCalendar et GregorianCalendar . Ce code est copié de la source JDK 7:

private static Calendar createCalendar(TimeZone zone,
                                       Locale aLocale) {
    Calendar cal = null;

    String caltype = aLocale.getUnicodeLocaleType("ca");
    if (caltype == null) {
        // Calendar type is not specified.
        // If the specified locale is a Thai locale,
        // returns a BuddhistCalendar instance.
        if ("th".equals(aLocale.getLanguage())
                && ("TH".equals(aLocale.getCountry()))) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            cal = new GregorianCalendar(zone, aLocale);
        }
    } else if (caltype.equals("japanese")) {
        cal = new JapaneseImperialCalendar(zone, aLocale);
    } else if (caltype.equals("buddhist")) {
        cal = new BuddhistCalendar(zone, aLocale);
    } else {
        // Unsupported calendar type.
        // Use Gregorian calendar as a fallback.
        cal = new GregorianCalendar(zone, aLocale);
    }

    return cal;
}

Maintenant, pourquoi travailler directement avec Calendar au lieu de GregorianCalendar? Parce que vous devez utiliser des classes abstraites et des interfaces, le cas échéant, au lieu de travailler directement avec les implémentations. Ceci est mieux expliqué ici: Que signifie "programmer pour une interface"?

En dehors de cela, si vous voulez travailler avec la date et l'heure, je vous recommande d'utiliser une bibliothèque telle que Joda-Time qui gère déjà et résout beaucoup de problèmes avec l'API Java Date actuelle et fournit également des méthodes pour récupérer cette date et objet times dans la version Java.util.Date.

15
Luiggi Mendoza

La première ligne de la question initiale contient l'expression "les différents types de date en Java et leur utilisation pratique"

L'utilisation pratique du type de données d'horodatage est exactement comme il est dit - un horodatage utilisé par le SQL pour enregistrer une valeur chronologique précise généralement utilisée pour les commandes transactionnelles. Les horodatages ne sont généralement utilisés qu'en interne, là où les nanosecondes comptent. Il existe des cas d'utilisation de données d'horodatage externes, mais ils sont relativement rares.

Le type de date traite 99% des besoins en données externes non scientifiques avec une précision de l'ordre de la milliseconde.

1
Rakesh Sharma