J'ai écrit cette fonction:
public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{
XMLGregorianCalendar xmlCalender=null;
GregorianCalendar calender = new GregorianCalendar();
calender.setTime(Util.stringToJavaDate(date));
xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
return xmlCalender;
}
public static Date stringToJavaDate(String sDate) throws OmniException{
Date date=null;
date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate);
return date;
}
Quand je passe la date en tant que "2014-01-07"
je reçois la date de sortie en tant que 2014-01-06T18:30:00:000Z
où je me trompe? aussi que faire si je veux obtenir uniquement 2014-01-06T18:30:00
et 2014-01-06T18:30:00Z
Toute aide est appréciée
Trouvé la solution comme ci-dessous .... l'afficher car cela pourrait aider quelqu'un d'autre aussi :)
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = format.parse("2014-04-24 11:15:00");
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar xmlGregCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
System.out.println(xmlGregCal);
Sortie:
2014-04-24T11: 15: 00.000 + 02: 00
Pour moi, la solution la plus élégante est celle-ci:
XMLGregorianCalendar result = DatatypeFactory.newInstance()
.newXMLGregorianCalendar("2014-01-07");
Utilisation de Java 8.
Exemple étendu:
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());
Cela imprime:
7
1
2014
GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
LocalDate.parse( "2014-01-07" )
.atStartOfDay( ZoneId.of( "America/Montreal" ) )
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )
2014-01-07 00:00:00
Ne confondez pas une valeur date-heure avec sa représentation textuelle. Nous analysons les chaînes pour obtenir un objet date-heure, et nous demandons à l'objet date-heure de générer une chaîne représentant sa valeur. L’objet date-heure n’a pas de format, seules les chaînes ont un format.
Alors changez votre façon de penser en deux modes distincts: modèle et présentation. Déterminez la date-valeur que vous avez à l'esprit, en appliquant le fuseau horaire approprié, en tant que modèle. Lorsque vous devez afficher cette valeur, générez une chaîne dans un format particulier, tel que prévu par l'utilisateur.
La question et les autres réponses utilisent toutes d'anciennes classes de date-heure problématiques, désormais remplacées par les classes Java.time.
Votre chaîne de saisie "2014-01-07"
est au format standard ISO 8601 .
T
au milieu sépare la partie date de la partie heure.
La Z
à la fin est l'abréviation de Zulu et signifie UTC .
Heureusement, les classes Java.time utilisent par défaut les formats ISO 8601 lors de l'analyse/de la génération de chaînes. Donc, pas besoin de spécifier un modèle de formatage.
LocalDate
La classe LocalDate
représente une valeur de date uniquement sans heure et sans fuseau horaire.
LocalDate ld = LocalDate.parse( "2014-01-07" ) ;
ld.toString (): 2014-01-07
ZonedDateTime
Si vous voulez voir le premier instant de cette journée, spécifiez un fuseau horaire ZoneId
pour obtenir un instant sur la timeline, un ZonedDateTime
. Le fuseau horaire est crucial car la date varie d'un fuseau à l'autre. Quelques minutes après minuit à Paris, la France est un nouveau jour alors qu’elle était encore «hier» à Montréal, au Québec.
Ne supposez jamais que la journée commence à 00:00:00. Des anomalies telles que l'heure d'été (DST) signifient que la journée peut commencer à une autre heure, telle que 01:00:00. Laissez Java.time déterminer le premier moment.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
zdt.toString (): 2014-01-07T00: 00: 00Z
Pour votre format souhaité, générez une chaîne en utilisant le formateur prédéfini DateTimeFormatter.ISO_LOCAL_DATE_TIME
, puis remplacez la T
au milieu par un SPACE.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " ) ;
2014-01-07 00:00:00
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date
, Calendar
_, & SimpleDateFormat
.
Le projet Joda-Time , désormais en mode maintenance , conseille de migrer vers les classes Java.time .
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Où obtenir les classes Java.time?
Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval
_, YearWeek
, YearQuarter
_ et plus _.