J'ai une colonne de date JDBC, que si l'AI utilise getDate est d'obtenir la partie ' date em>' composée uniquement Cependant, la «date» renvoyée par GettiMestamp 'ignore' les valeurs GMT, supposons que la date; 02 oct. 2009 13: 56: 78: 890 strong>, je finis à obtenir 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 P>
Comment peut toujours obtenir ma date, comme c'est le cas, Edit p>
Je reçois la date +2 du côté client qui est sur GMT +2 P>
5 Réponses :
Vous devez être conscient que Pour afficher une date dans un fuseau horaire spécifique, convertissez-la en une chaîne par Utilisation d'un java.util.date code> (ainsi que
java.sql.date code> et
java.sql.timestamp code>, lequel sont des sous-classes de
java.util.date code>) ne savent rien des fusions horaires ou plutôt, ils sont toujours en uc.
java.util.date code> et son Les sous-classes ne sont rien de plus qu'un conteneur pour un «nombre de millisecondes depuis 01-01-1970, 12h00 UTC». P>
java.text.dateformat code> objet. Définissez le fuseau horaire sur cet objet en appelant la méthode
SettiMezone () Code>. Par exemple: p>
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. P>
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. P>
Vous pouvez modifier le type de colonne ou faire la conversion vous-même. Je recommande une approche ancienne. p>
Mot-clé Convertit B>, 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
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) P>
Lorsque la méthode JDBC GetTimeMestamp est appelée, il ne reçoit que la portion STR> 'Milliseconds strong>' EM> et créez un objet de date avec le fuseau horaire du serveur, qui est GMT. P>
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. P>
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. P>
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. P>
sur la FAQ d'Oracle il y a une section à ce sujet: p>
avant 9201, cela reviendra: GetObject pour Sysdate: Java.SQL.TMESTAMP <<<< GetDate pour sysdate: java.sql.date GettiMeTamp pour Sysdate: Java.SQL.TMESTAMP P>
A partir de 9201, les éléments suivants seront retournés p>
getObject pour sysdate: java.sql.date <<<<<< GetDate pour sysdate: java.sql.date >> Pas de changement gettiMetamp for sysdate: java.sql.talestamp >> Pas de changement P>
Remarque: java.sql.date n'a pas de portion de temps alors que java.sql.timestamp fait. P>
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: p>
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 p>
'oracle.jdbc.v8compatible' p>
peut être définie sur "vrai" et le conducteur se comporte comme il se comporte à 8i, 901x, 9 200 (par rapport à des horodatages). P>
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. P> 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. P> '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. P> 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. P> Donc, pour ma situation, j'ai eu un code comme celui-ci: p> 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. P> 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é !!. P> 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. P> p>
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); }