8
votes

JDBC Timeestamp et Date GMT Problèmes

J'ai une colonne de date JDBC, que si l'AI utilise getDate est d'obtenir la partie ' date ' composée uniquement 02 oct. 2009 mais si j'utilise gettiMestamp je suis pleinement " date ' 02 oct. 2009 13: 56: 78: 890 . C'est crucieusement ce que je veux.

Cependant, la «date» renvoyée par GettiMestamp 'ignore' les valeurs GMT, supposons que la date; 02 oct. 2009 13: 56: 78: 890 , je finis à obtenir 02 oct. 2009 15: 56: 78: 890

Ma date a été enregistrée comme une date de + 2GMT sur la base de données, mais le serveur d'applications est sur GMT I.E 2HRS derrière

Comment peut toujours obtenir ma date, comme c'est le cas, 02 oct. 2009 13: 56: 78: 890

Edit

Je reçois la date +2 du côté client qui est sur GMT +2


0 commentaires

5 Réponses :


4
votes

Vous devez être conscient que java.util.date (ainsi que java.sql.date et java.sql.timestamp , lequel sont des sous-classes de java.util.date ) ne savent rien des fusions horaires ou plutôt, ils sont toujours en uc.

java.util.date et son Les sous-classes ne sont rien de plus qu'un conteneur pour un «nombre de millisecondes depuis 01-01-1970, 12h00 UTC».

Pour afficher une date dans un fuseau horaire spécifique, convertissez-la en une chaîne par Utilisation d'un java.text.dateformat objet. Définissez le fuseau horaire sur cet objet en appelant la méthode SettiMezone () . Par exemple: xxx


0 commentaires

13
votes

C'est la différence entre l'horodatage et d'autres types temporels dans MySQL. L'horodatage est enregistré comme unix Time_T en UTC, mais d'autres types Store Date / Time Littéralement sans informations sur la zone.

Lorsque vous appelez GetTimeStamp (), MySQL JDBC Pilote convertit l'heure à partir de GMT en fuseau horaire par défaut si le type est horodatage. Il n'effectue aucune conversion de ce type pour d'autres types.

Vous pouvez modifier le type de colonne ou faire la conversion vous-même. Je recommande une approche ancienne.


3 commentaires

Mot-clé Convertit , c'est pourquoi je reçois les +2 heures


Je suis confus, si la conversion fonctionne correctement, ne devrait-il pas voir une date de 2 heures de moins, au lieu de plus?


C'était assez proche et m'a guidé à ma solution finale



0
votes

de ce POST I EN CONCLUSION que JDBC récupère le fuseau horaire de la TimeStamp (Je ne pense pas que MS SQL supporte également cela, la plupart des résultats Google pointent sur Oracle)

Lorsque la méthode JDBC GetTimeMestamp est appelée, il ne reçoit que la portion 'Milliseconds ' et créez un objet de date avec le fuseau horaire du serveur, qui est GMT.

Lorsque cet objet de date est présenté à mon client, qui est de +2 GMT, il ajoute 2 heures, ce qui est le décalage standard qui conduit à des heures supplémentaires.

Je suis corrigé cela en supprimant le délai de décalage de la date que je récupère i.e. Convertir à la date GMT vraie.


0 commentaires

3
votes

J'ai rencontré un problème similaire l'autre jour où le composant temporel était tronqué de certaines dates.

Nous l'avons réduit à une différence dans les versions de pilote Oracle.

sur la FAQ d'Oracle il y a une section à ce sujet:


xxx

avant 9201, cela reviendra: GetObject pour Sysdate: Java.SQL.TMESTAMP <<<< GetDate pour sysdate: java.sql.date GettiMeTamp pour Sysdate: Java.SQL.TMESTAMP

A partir de 9201, les éléments suivants seront retournés

getObject pour sysdate: java.sql.date <<<<<< GetDate pour sysdate: java.sql.date >> Pas de changement gettiMetamp for sysdate: java.sql.talestamp >> Pas de changement

Remarque: java.sql.date n'a pas de portion de temps alors que java.sql.timestamp fait.

avec ce changement de Mappage de types de données, une application échouera et / ou générera des résultats incorrects lorsque le pilote JDBC est mis à niveau à partir de 8I / 9IR1 sur pilote JBDC 920x. Pour maintenir la compatibilité et maintenir les applications fonctionnant après la mise à niveau, un drapeau de compatibilité a été fourni. Les développeurs ont maintenant quelques options:

  1. Utilisez drapeau Oracle.JDBC.v8Compatible.

    JDBC pilote ne détecte pas la version de la base de données par défaut. Pour modifier le drapeau de compatibilité pour la manipulation de types de données horodatapes, la propriété de connexion

    'oracle.jdbc.v8compatible'

    peut être définie sur "vrai" et le conducteur se comporte comme il se comporte à 8i, 901x, 9 200 (par rapport à des horodatages).

    Par défaut, le drapeau est défini sur "Faux". Dans le constructeur d'oracleconnection, le pilote obtient la version du serveur et définit le drapeau de compatibilité de manière appropriée. xxx

    avec jdbc 10.1.0.x, au lieu de la propriété de connexion, la propriété système suivante peut Soyez utilisé: Java -doracle.JDBC.V8Compatible = true ..... Remarque: ce drapeau est un signal client qui régit le mappage de l'horodatage et de la date. Cela n'affecte aucune fonctionnalité de base de données.

    '2. Utilisez SET / GETDATE et SET / GETTIMESTAMTAM Lorsque vous traitez avec la date et le type de données de la colonne de la colonne d'horodatage en conséquence.

    9i Server prend en charge les types de colonne de date et d'horodatage Date est mappée sur Java.SQL.Date et l'horodatage est mappé sur Java .sql.timédiatamp.


    Donc, pour ma situation, j'ai eu un code comme celui-ci: xxx

    avec 9i je recevais un java.sql .Timestamp (qui est une sous-classe de java.Util.date) alors tout était groovy et j'avais mes heures et mes minutes.

    mais avec 10g, le même code obtient maintenant un java.sql.date (aussi une sous-classe de java.util.Date de sorte qu'il compile toujours) mais le HH: mm est tronqué !!.

    La 2e solution était assez facile pour moi - il suffit de remplacer le getDate avec GetTimeStamp et vous devriez être correct . Je suppose que c'était une mauvaise habitude.


0 commentaires

0
votes
private Date convertDate(Date date1) throws ParseException {
        SimpleDateFormat sdfFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdfFormatter.format(date1);
        SimpleDateFormat sdfParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdfParser.setTimeZone(TimeZone.getTimeZone("GMT"));
        return sdfParser.parse(dateStr);
    }

0 commentaires