7
votes

DateTime ne s'égare pas après la désériisation

Comme vous pouvez le voir ci-dessous, après la sérialisation et la désériénation, vous obtenez des instances DateTime qui sont soi-disant différentes: xxx

selon JAVADOC de NOREFERRER, Equals " compare Cet objet avec l'objet spécifié pour l'égalité basé sur l'instant, la chronologie et le fuseau horaire de millisecondes. " Cela ne devrait donc pas être bon? Qu'est-ce que je manque?


3 commentaires

pourrait-il être parce que vous comparez avec == au lieu de égale ?


Si vous utilisez Scala, comme il semble, pouvez-vous marquer votre question en conséquence pour éviter toute confusion.


@gtgaxiola @rakeshkr, en fait, à Scala, == est une méthode finale sur tout qui appelle est égal à .


4 Réponses :



3
votes

Je n'ai pas org.joda.time.datetime mais je viens d'essayer un test avec java.Util.date.

Vous devriez essayer ceci: p>

2014-01-08T19:05:52.182+01:00
2014-01-08T19:05:52.182+01:00
false


5 commentaires

désolé pourquoi -2? Est-ce pour == au lieu d'égaux? Ne savez-vous pas qu'avec l'interpréteur Scala A == B signifie A.Equals (B)? Voir Stackoverflow.com / Questions / 7681161 / ...


Mon uppote pour vous avoir prouvé que la cause n'est pas l'utilisation de l'opérateur Scala ==.


La réduction de cette méthode est que vous n'avez plus de date sérialisée lisible par l'homme.


Désolé @samdufel quelle méthode faites-vous référence? Je veux dire quelle méthode de DateTime: égale ou ostring ou analyse?


Je pense que le problème est que Tostring et Analys ne sont pas liés et il est donc faux d'assumer l'équivalence. Ce n'est qu'un problème de contrat. Je préfère diviser la lisibilité humaine de la sérialisation (lorsque Serialiaze et insérifiez un objet Les deux instances doivent être égales)



13
votes

Voici la seule bonne réponse, trouvée par vos propres tests:

System.out.println(
    DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'['ZZZ']'").print(a));
// Output: 2014-01-08T19:38:00.696[Europe/Berlin]


5 commentaires

Il me semble que le bug est avec parse qui n'utilise pas le fuseau horaire par défaut ... mais l'analyse d'une date sortant d'un Tostring est plutôt impair.


@Jonathandrapeau non La méthode d'analyse n'est correcte car elle lit la chaîne de fuseau horaire "+01: 00" et la traite comme un décalage, jusqu'à présent, d'accord (les informations de fuseau horaire dans le texte doivent avoir la priorité par rapport au paramètre de fuseau horaire dans le format de format ). Mais sinon je conviens que toute la procédure est étrange. Je ne l'appellerais pas non plus une "non-syndicalisation", tout comme formatage et répandre.


Lorsque vous utilisez des types complexes tels que DateTime, il est préférable d'éviter d'utiliser un moyen générique pour construire un objet. Dans l'exemple, le problème est avec le fuseau horaire, mais les millis sont identiques, donc aje.compareto (b) == 0. L'égalité pour un type complexe n'est pas toujours un concept simple comme égalité pour l'état d'une instance d'objet de ce type. Par exemple, l'égalité des bigdecimales n'est pas la même chose que le comparèteo (sur valeur) car la valeur de vérification de l'égalité et l'échelle de l'échelle tandis que la valeur comparète seulement de BigDecimal ("1.0"). Equals (nouveau BigDecimal ("1.00") est faux tandis que neuf BigDecimal ("1.0 ") .compareto (nouveau BigDecimal (" 1.00 ") == 0.


Merci pour la perspicacité. Je suppose que le problème est que Joda DateTime fournit plus de détails que le format ISO8601. Je vais sous-classer DateTime et remplacer égale pour rendre la comparaison de chronologie moins précise.


Je ne sais pas si Scala peut faire de la magie de sous-classe, mais au moins dans la sous-classement de Java pur n'est pas possible, car la classe est définitive. Autant que je sache, le projet Jodatime Lead S. Colebourne a ensuite regretté la décision de conception d'avoir un Chronologie Plugable .



5
votes

J'ai ouvert un problème sur github, Voici la réponse de l'auteur : < / p>

Il y a longtemps, j'ai choisi le format de Tostring de DateTime et j'ai omis d'inclure l'état complet du type de valeur. En conséquence, deux objets semblent être égaux (par tostring) mais ils ne le sont pas. C'était une erreur car elle provoque ce type de confusion. Malheureusement, il ne peut pas être corrigé.

Le comportement d'analyse est également malheureux, car il se concentre trop sur le décalage et pas assez sur la zone horaire (comme ISO-8601 ne gère pas les identifiants de fuseau horaire). Encore une fois, il est trop tard pour faire des changements ici.


0 commentaires