web-dev-qa-db-fra.com

Conversion de la date en chaîne en xmlgregoriancalendar

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

23
JavaStudent

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

31
JavaStudent

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
15
gil.fernandes
GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
1
regulus001

tl; dr

LocalDate.parse( "2014-01-07" )
         .atStartOfDay( ZoneId.of( "America/Montreal" ) )
         .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
         .replace( "T" , " " )

2014-01-07 00:00:00

Date-heure! = String

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.

Évitez les anciennes classes date-heure

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.

ISO 8601

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

Début de journée 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


À propos de Java.time

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 _.

0
Basil Bourque