Comment utiliser DateTimeZone en Java
J'ai essayé de convertir un serveur de la date et de l'heure d'utilisateur avec le code suivant
@Test
public void playingWithJodaTime() {
LocalDateTime localDateTime = new LocalDateTime();
System.out.println("server localDateTime : "
+ localDateTime.toDateTime(DateTimeZone.getDefault()).toDate());
System.out.println("user's localDateTime : "
+ localDateTime.toDateTime(DateTimeZone.forID("Asia/Jakarta"))
.toDate());
}
Résultat imprimé
server localDateTime : Tue Dec 17 00:04:29 SGT 2013
user's localDateTime : Tue Dec 17 01:04:29 SGT 2013
Cependant le résultat imprimé est pas comme ce que j'attendais depuis la zone serveur de temps est (UTC+08:00) Kuala Lumpur, Singapore
alors que l'utilisateur est (UTC+07:00) Bangkok, Hanoi, Jakarta
.
Qu'ai-je fait de mal ?
OriginalL'auteur abiieez | 2013-12-16
Vous devez vous connecter pour publier un commentaire.
De la conversion de DateTime à java Date (pourquoi?).
java.util.Date
utilise JVM par défaut de temps de la zoneDonc, vous avez manqué de temps de la zone à cette conversion.
Cet exemple fonctionne comme prévu:
si vous voulez convertir joda DateTime à autre chose, puis de le convertir en Calendrier
OriginalL'auteur Ilya
L'erreur est l'utilisation de jour(). Pourquoi? En disant à jour() vous permet de convertir votre LocalDateTime à java.util.Date de fuseau horaire indépendant. Mais ensuite, vous utilisez implicitement le toString()-méthode sur j.u.Date qui utilise votre fuseau horaire par défaut, dans les deux cas, vous obtenez la même représentation.
La solution est simplement de laisser l'appel de jour(). JodaTime objets ont une meilleure toString()-implémentations suit de près la norme ISO et imprimer le résultat dans différents fuseaux horaires comme vous l'avez spécifié.
Le
toDate()
méthode de Joda-Time est nécessaire en tant que passerelle pour interagir avec les anciennes classes qui prennent uniquement en charge java.util.Date. Cette méthode est une fonction, et certainement pas d'un défaut de conception. JSR 310 en Java 8, en effet, faire la même chose, sauf qu'ils ont mis la méthode de conversion à la Date de la classe comme unfrom
méthode plutôt que d'uneto
méthode.Je sais que le but du jour() comme passerelle/pont vieux jdk choses. La différence est là que cette méthode devrait être placé directement dans DateTime ou mieux ailleurs? Cette stackoverflow question indique un facile d'utilisation abusive de cette "fonctionnalité". Nous devrions essayer de déplacer les utilisateurs sont loin de la j.u.De la Date et de ne pas les encourager à l'utiliser.
Je suis d'accord. Très malin de la JSR 310 équipe pour déplacer la méthode de conversion à la java.util.Date de catégorie pour la raison que vous citez.
OriginalL'auteur Meno Hochschild
Un
LocalDateTime
représente un datetime sans un fuseau horaire.En appelant
toDateTime(DateTimeZone)
vous enrichir laLocalDateTime
avec le fuseau horaire fourni pour obtenir uneDateTime
qui a la même date et heure que l'originalLocalDateTime
mais est associé avec le fuseau horaire fourni. Notez que vous ne vous convertissez pas lors de l'appel detoDateTime
, parce que le local d'origine datetime ne sont pas associés à un fuseau horaire.Sur Le serveur :
Tue Dec 17 00:04:29 2013
.UTC+08:00
fuseau horaire.toDate().toString()
c'est converti à une représentation dans le fuseau horaire par défaut+08:00
(ouSGT
) qui estTue Dec 17 00:04:29 SGT 2013
. La conversion est une identité parce que le fuseau horaire estSGT
.Sur l'utilisateur:
Tue Dec 17 00:04:29 2013
UTC+07:00
fuseau horaire.toDate().toString()
vous convertir à la représentation dans le fuseau horaire par défaut+08:00
(ouSGT
), donc le temps estTue Dec 17 01:04:29 SGT 2013
. Il y a un +1 heure de décalage horaire entre Singapour et Jakarata et donc, il est 1 heure du matin à Singapour quand il est minuit à Jakarta.OriginalL'auteur cyon
Pour moi, ce code a fait le travail.
Où les classes sont
De sortie est :
OriginalL'auteur A_01