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: selon JAVADOC de NOREFERRER, Equals code>" 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? P> p>
4 Réponses :
Consultez ce message: Quelle est la différence entre == vs égaux () dans Java? a> p> == code> comparera la référence,
égaux () code> compare les valeurs. Essayez
a.equals (b) code> p>
Après avoir regardé Scala Boys, commenter la signification de == à Scala, cette réponse ne semble pas correcte. Mais même égale () code> produit de faux, comme je l'ai prouvé dans mon test, voir ma réponse.
Cela est vrai pour Java, alors que dans Scala == () code> qui est un appel à
égal () code> compare les valeurs et
x.eq (y) code> vérifie si
y code> est une référence à
x code> a >.
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
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)
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]
Il me semble que le bug est avec parse code> qui n'utilise pas le fuseau horaire par défaut ... mais l'analyse d'une date sortant d'un
Tostring code> 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 code> 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 .
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é. P>
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. P> blockQuote>
pourrait-il être parce que vous comparez avec
== code> au lieu de
égale code>?
Si vous utilisez Scala, comme il semble, pouvez-vous marquer votre question en conséquence pour éviter toute confusion.
@gtgaxiola @rakeshkr, en fait, à Scala,
== code> est une méthode finale sur
tout code> qui appelle
est égal à code>.