2017-10-12 16 views
0

J'utilise IntelliJ pour mon programme (j'utilise le langage Kotlin et Java), j'essaie d'obtenir un rapport de temps en utilisant une requête de ma base de données et de l'envoyer au navigateur (J'utilise Postman pour voir le résultat). Quand je débogue mon code et passe par le résultat de la requête, le fuseau horaire est correct, comme je le veux, son show même -7 (le temps de différence entre moi et l'UTC) mais quand il s'agit du navigateur (Facteur) indiquant l'heure UTC et +0000, par exemple ("date": "2017-10-12T15: 00: 33.000 + 0000" au lieu de "date": "2017-10-12T15: 00: 33.000 + 0007"). J'ai essayé beaucoup d'options et j'ai gaspillé environ 6 heures pour trouver la solution mais rien ne fonctionne. Nous vous remercions de l'aideTimeZone ne montre pas

Répondre

0

Postgres stocke un TIMESTAMP WITH TIME ZONE dans UTC, en rejetant la zone passée après l'avoir utilisé pour effectuer le réglage en UTC. Notez qu'il s'agit d'un comportement propre à Postgres - les bases de données varient considérablement dans leur gestion de la date et de l'heure, et la spécification SQL touche à peine le sujet. Comme l'a commenté Marlowe, si vous devez vous rappeler le fuseau horaire saisi à partir de la saisie de données, vous devrez le stocker dans une autre colonne. Capturez un proper time zone name au format continent/region, tel que America/Montreal, Africa/Casablanca ou Pacific/Auckland. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que EST ou IST car elles sont et non fuseaux horaires, non normalisés, et même pas uniques (!).

➠ Voici une petite question: Une session Postgres dans un outil interactif tel que pgAdmin applique dynamiquement un fuseau horaire par défaut après avoir récupéré la valeur UTC. Bien que bien intentionné, il s'agit d'un anti-dispositif à mon avis car il obscurcit la véritable nature des données stockées.

Récupère la valeur en UTC en utilisant les classes modernes java.time.

Instant instant = myResultSet.getObject(… , Instant.class) ; 

Ajustez le fuseau horaire souhaité.

ZoneId z = ZoneId.of("Asia/Kolkata") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

Générer une chaîne pour le navigateur Web en utilisant la classe DateTimeFormatter. Notez les fonctions de localisation automatique ici.

Tout cela a été couvert de nombreuses fois sur Stack Overflow. Cherchez pour en savoir plus.

+0

merci pour votre réponse. mais parce que j'utilise Kotlin je ne peux pas utiliser votre solution, j'ai essayé quelque chose de similaire avant mais pas de succès –

+0

@TalShani cela ne devrait pas d'importance. Kotlin est entièrement capable de Java interop. En fait, si vous copiez-collez du code Java dans IntelliJ, il vous proposera de le convertir en Kotlin. – Moira

+0

@ 1blustone ouais je sais mais ne fonctionne toujours pas pour une raison quelconque, les données sont exactes après avoir réparé le fuseau horaire, mais sur la seconde, il est censé aller au navigateur, il change encore –

0

Solution: donc j'ai trouvé la solution à mon problème ici: Overriding BeanPropertyRowMapper to Support JodaTime DateTime

dans peu de temps, le type d'horodatage ne fonctionne pas bien avec fuseau horaire si je l'ai changé à DateTime en Joda et enveloppa le résultat de la requête par Bean costumed (à partir du lien j'ai posté)