web-dev-qa-db-de.com

Zeichenfolge Datum in xmlgregoriancalendar Konvertierung

Ich habe diese Funktion geschrieben:

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;  
}

Wenn ich als "2014-01-07" Datum übergeben werde, bekomme ich als 2014-01-06T18:30:00:000Z____ Datum ausgegeben. Wo gehe ich falsch aus? Was kann ich tun, wenn ich nur 2014-01-06T18:30:00 und 2014-01-06T18:30:00Z erhalten möchte?
.__ Jede Hilfe wird geschätzt 

23
JavaStudent

Ich habe die Lösung wie folgt gefunden ... und sie veröffentlicht, da sie auch jemand anderem helfen könnte :)

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);

Ausgabe:

2014-04-24T11: 15: 00.000 + 02: 00

31
JavaStudent

Für mich ist die eleganteste Lösung diese:

XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");

Java verwenden 8.

Erweitertes Beispiel:

XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());

Dies druckt aus:

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

Datum-Uhrzeit! = Zeichenfolge

Kombinieren Sie einen Datum-Uhrzeit-Wert nicht mit seiner Textdarstellung. Wir analysieren Zeichenfolgen, um ein Datumszeitobjekt zu erhalten, und wir bitten das Datumszeitobjekt, eine Zeichenfolge zu generieren, die seinen Wert darstellt. Das Date-Time-Objekt hat kein "Format", nur Zeichenfolgen haben ein Format.

Versetzen Sie Ihr Denken in zwei getrennte Modi: Modell und Präsentation. Bestimmen Sie den Datumswert, den Sie als Modell haben, und verwenden Sie die entsprechende Zeitzone. Wenn Sie diesen Wert anzeigen müssen, generieren Sie eine Zeichenfolge in einem bestimmten Format, wie vom Benutzer erwartet.

Vermeiden Sie alte Datumszeitklassen

Die Frage und andere Antworten verwenden alte problematische Datums-/Uhrzeit-Klassen, die jetzt durch die Java.time-Klassen ersetzt werden.

ISO 8601

Ihre Eingabezeichenfolge "2014-01-07" hat das Standardformat ISO 8601 .

Die T in der Mitte trennt den Datumsteil vom Zeitteil.

Die Z am Ende ist eine Abkürzung für Zulu und bedeutet UTC .

Glücklicherweise verwenden die Java.time-Klassen standardmäßig die ISO 8601-Formate, wenn Strings analysiert und generiert werden. Sie müssen also kein Formatierungsmuster angeben.

LocalDate

Die LocalDate -Klasse steht für einen Datumswert ohne Uhrzeit und ohne Zeitzone.

LocalDate ld = LocalDate.parse( "2014-01-07" ) ;

ld.toString (): 2014-01-07

Tagesbeginn ZonedDateTime

Wenn Sie den ersten Moment dieses Tages sehen möchten, geben Sie eine ZoneId-Zeitzone an, um einen Moment auf der Timeline anzuzeigen, eine ZonedDateTime. Die Zeitzone ist wichtig, da das Datum auf der ganzen Welt von Zone zu Zone variiert. Ein paar Minuten nach Mitternacht in Frankreich ist Frankreich ein neuer Tag, während er in Montréal Québec noch „gestern“ ist.

Gehen Sie niemals davon aus, dass der Tag um 00:00:00 beginnt. Anomalien wie die Sommerzeit (DST) bedeuten, dass der Tag zu einer anderen Uhrzeit beginnen kann, z. B. 01:00:00. Lassen Sie Java.time den ersten Moment bestimmen.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

zdt.toString (): 2014-01-07T00: 00: 00Z

Generieren Sie für Ihr gewünschtes Format einen String mit dem vordefinierten Formatierer DateTimeFormatter.ISO_LOCAL_DATE_TIME und ersetzen Sie dann die T in der Mitte durch ein Leerzeichen.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " ) ; 

2014-01-07 00:00:00


Über Java.time

Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Legacy Date-Time-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time - Projekt, jetzt im Wartungsmodus , empfiehlt die Migration zu den Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .

Wo erhalten Sie die Java.time-Klassen? 

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen, wie zum Beispiel Interval , YearWeek , YearQuarter und more .

0
Basil Bourque