2014-06-05 5 views
-1

Je vais obtenir une date comme Sat May 31 16:38:17 GMT 2014. En DB, la colonne a la même valeur. Mais quand je vais chercher une date comme Sat May 31 16:30:00 GMT 2014 il ne cherchera pas. Mais si je donne moins de 5:30 hours comme Sat May 31 11:00:00 GMT 2014. Ça fonctionne bien.Calendrier/Date fuseau horaire Conversion problème

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-0:00")); 
cal.setTimeInMillis(inputDate.getTime()); 
cal.set(Calendar.MILLISECOND, 0); 
inputDate = cal.getTime(); 
+0

De quel fuseau horaire utilise la base de données? – Dawnkeeper

+0

Lorsque j'ai exécuté "select dbtimezone from dual", il a donné "+00: 00" – user2902067

+0

Ok. Que faites-vous exactement? Insérer dans la base de données? Sélection à partir de DB? Et comment (comme dans 'exemple de code')? – Dawnkeeper

Répondre

0

La mise en œuvre sous-jacente de Date et Calendar les deux utilisent le même système: un représentant long millisecondes depuis le 1er Janvier 1970, 00:00:00 GMT. Voir Here pour Date (lignes 136 & 168) et HERE pour Calendar (ligne 778)

Donc cela nous arrive à ceci:

cal.setTimeInMillis(inputDate.getTime()); 
    // this gets the long from the Date and puts it into the Calendar 
    // nothing is changed, you only get added functionality 
    // even if you change the Timezone this only affects how it is displayed 

    cal.set(Calendar.MILLISECOND, 0); 
    // the long is modified by setting the that represents only milliseconds to zero 

    inputDate = cal.getTime(); 
    //the long is stored in a Date and returned 

Vous rentreras un objet Date peu modifié. Sans la seconde instruction, il n'y aurait aucun changement. Cela explique pourquoi rien n'est converti, mais pas pourquoi la sélection ne fonctionne pas. D'après l'information que vous avez donnée, il semble qu'il y ait une discordance dans les fuseaux horaires de la trinité de la DB, de la JVM et de votre système. Quelque chose dans la ligne de ceci: votre système est réglé sur IST et votre JVM interprète en quelque sorte l'heure de votre système comme GMT. Pour vérifier cela, vous pouvez exécuter System.out.println(new Date()). S'il écrit le fuseau horaire comme GTM mais que les chiffres sont les mêmes que ceux de votre horloge système (IST), alors c'est votre problème.

Vous pouvez également consulter:

  • font les horodatages d'un match de déclaration d'insertion avec ce qui arrive dans la base de données
  • faire les horodatées d'une entrée de la base de données correspond à celui que vous recevez après un select