Comment comparer XMLGregorianCalendar avec seulement la partie Date (jour, mois, année)?
Je suis le développement d'un webservice intégré avec le printemps-struts application web, dans XSD il y a un XMLGregorianCalendar type de propriété, disons que le nom de la propriété est trxDate.
Dans SOAPUI application de test, si j'ai inséré la valeur de trxDate avec: publication 2013-02-21, puis j'ai envoyé le soap xml les données de la demande et j'ai imprimé la valeur dans la méthode de service: Système de..println(trxDate), la méthode d'impression de la résultat est le même saisi: publication 2013-02-21.
Maintenant, je suis en train de créer une fonction pour comparer trxDate avec la date actuelle. Je sais que nous pouvons le comparer à l'aide de trxDate.comparer(dateactuelle) de la méthode. Le problème est que je ne sais pas comment le créer XMLGregorianCalendar ensemble de l'objet avec la date actuelle Date en partie seulement (jour, mois et année) à utiliser pour la comparaison.
J'ai essayé avec ce code:
GregorianCalendar gc = new GregorianCalendar();
gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
gc.set(GregorianCalendar.MINUTE, 0);
gc.set(GregorianCalendar.SECOND, 0);
gc.set(GregorianCalendar.MILLISECOND, 0);
XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
System.out.println(xgc);
Le résultat est:
2013-02-20T00:00:00.000+07:00
Mais je m'attends à:
2013-02-20
Si l'utilisation de la date (xgc) à comparer avec trxDate:
int result = trxDate.compare(xgc);
Le résultat est 2, ce qui signifie: durée INDÉTERMINÉE (à partir de DatatypeConstants classe). Le bon résultat doit être -1, 0 ou 1.
Quel est donc le problème avec mon code?
OriginalL'auteur null | 2013-02-20
Vous devez vous connecter pour publier un commentaire.
Au lieu d'essayer de supprimer les indésirables champs de la
GregorianCalendar
, il peut être plus facile de créer une liste non-initialiséXMLGregorianCalendar
puis copier uniquement les champs que vous ne voulez:Cela évite les aller-retour à la Chaîne et de retour à nouveau qu'il serait nécessaire si vous utilisez
newXMLGregorianCalendar(lexicalRepresentation)
J'ai juste essayé votre code, il existe un peu d'erreur, vous devez ajouter +1 à la
xgc.setMonth()
, de sorte que le code devrait être:xgc.setMonth(now.get(Calendar.MONTH)+1);
. Il semble XMLGregorianCalendar utilise une base de mois de l'indice.merci, j'ai édité la réponse à résoudre ce problème.
OriginalL'auteur Ian Roberts
La javadoc pour XMLGregorianCalendar.comparer explique qu'il utilise le règles à partir de la spécification de Schéma XML pour la comparaison, à laquelle la javadoc des liens.
La Section B. 1. de l'algorithme de comparaison d'états que les deux dateTimes doit avoir exactement le même (sous -) ensemble de {année, mois, jour, heure, minute, seconde} les champs définis. S'ils ne le font pas, le résultat est indéterminé. (Le Schéma XML spec utilise
<>
dans la description d'algorithme pour indiquer un résultat indéterminé.)Donc si vous avez un XMLGregorianCalendar avec seulement l'année, le mois et le jour défini, vous devez le comparer avec un autre XMLGregorianCalendar avec seulement l'année, le mois et le jour défini. Soit vous devez l'analyser à partir d'une chaîne, comme Blaise, ou, plutôt, vous devez instancier un XMLGregorianCalendar et appel
setYear
,setMonth
etsetDay
sur vous-même.OriginalL'auteur VGR
Mise à JOUR
Vous pouvez également créer votre
XMLGregorianCalendar
de cette façon:Vous pouvez utiliser la méthode suivante:
Démo
Sortie
Waouh, je suis tellement confus il existe de nombreuses façons, ce qui est mieux entre votre chemin et Ian?
OriginalL'auteur bdoughan
essayer
c'est un conseil (ordre) de XMLGregorianCalendar à utiliser
xsd:date
type où le temps n'est pas définiOriginalL'auteur Evgeniy Dorofeev