2014-05-21 6 views
-3
Date date = //getting Date object of (record inserted datetime) using Hibernate query . 
DateTime currentDateTime = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC); 
System.out.println("Current Date Time " + currentDateTime); 
DateTime utcDateTime = new DateTime(date, DateTimeZone.UTC); 
System.out.println("UTC Date Time :: " + utcDateTime); 
Period per = new Period(currentDateTime.toLocalDateTime(), utcDateTime.toLocalDateTime()); 
System.out.println("Period time in sec ::" + (float) per.toStandardSeconds().getSeconds()); 
System.out.println("Period time in minutes::" + (float) per.toStandardSeconds().getSeconds()/60); 
System.out.println("Period time in hours::" + (float) per.toStandardSeconds().getSeconds()/(60 * 60)); 

Je stocke toutes les données avec le fuseau horaire UTC dans la base de données MySQL. Maintenant, je veux obtenir le décalage horaire entre l'heure actuelle et l'enregistrement inséré. Mon fuseau horaire local est GMT + 5: 30. Je me trompe d'heures (+5: 30 heures avec différence réelle) en différence de temps. Je ne sais pas où je fais erreur? J'utilise ce code pour stocker la date dans DB.

EDIT:
Différence de temps erronée en minutes/heure avec l'API joda et le fuseau horaire UTC

DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(format); 
DateTime dateTime = new DateTime(DateTimeZone.UTC); 
return dateTime.toString(dateTimeFormatter); 
+0

Il n'est pas du tout clair que le problème est avec Joda Time ici. Quelle est la valeur de 'date'? (Et est-ce un 'java.sql.Date' ou un' java.util.Date'?) Quelle valeur a été enregistrée dans la base de données? Cela n'aide pas que vous ne nous ayez montré aucune des valeurs impliquées ... et vous ne comprenez pas pourquoi vous convertissez en 'LocalDateTime'. –

+1

c'est java.util.Date. Voir la question mise à jour. –

+1

Je ne sais pas comment vous êtes passé du commentaire ci-dessus à votre édition ... –

Répondre

0

Votre question est source de confusion et devrait être réécrite.

Inutile d'appeler currentTimeMillis car DateTime le fait par défaut.

Inutile de téléphoner à LocalDateTime. Cela serait utilisé lorsque vous voulez perdre le fuseau horaire, mais vous êtes déjà en UTC donc pas de fuseau horaire s'applique donc pas besoin de déposer le fuseau horaire.

Vous travaillez trop dur avec les lignes println calculant sec, minutes, heures. La classe PeriodFormatterBuilder effectue un tel travail.

Vous devez être clair à propos de java.util.Date et de java.sql.Date. Ce dernier définit la portion de temps sur zéros. Aucun n'a de fuseau horaire. Soyez conscient d'un troisième type livré avec Java, java.sql.Timestamp. Lors du débogage et de la publication de ce type de question, obtenez les millisecondes qui renvoient les objets Date et DateTime afin que nous ayons des données précises.

Dans mon travail habituel, j'évite d'utiliser ou de penser en millisecondes, mais pour le débogage, cela peut être utile. Comme Jon Skeet l'a dit, vous devriez stocker des valeurs date-heure comme types date-heure dans votre base de données plutôt que des chaînes.

Je vous suggère de rechercher StackOverflow pour de nombreuses questions similaires en fournissant un exemple de code.

+0

Salut @Basil, vraiment merci pour votre réponse et de si belles suggestions. Mais je ne peux vraiment pas comprendre à quel point c'est déroutant. Je n'utilise pas le type de date 'VARCHAR' dans ma base de données, j'utilise' DATETIME'. J'utilise simplement 'String' pour le stocker. Cela va-t-il poser un problème?Autre que juste je stocke et récupère la date de DB. Et cela me donne des données erronées. Comment? C'est une question. S'il vous plaît aidez-moi si possible –

+0

voir ma nouvelle question par laquelle vous pouvez être plus clair: http://stackoverflow.com/questions/23823671/how-to-avoid-my-local-timezone-while-fetching-date-from -db-using-hibernate –

Questions connexes