Hi!
Die Ausgangslage ist, dass ich einen Time_stamp aus einem JSON in ein XML schreiben will.
JSON:
Im Json ist die UTC-Zeit (z.B. England) gegeben, daher hole ich mir erstmal das Date-Objekt.
An bestimmten Stelle nicht wundern, denn SimpleDateFormat kann nicht Mikrosekunden handeln, daher muss man den Time-String auf dem json an entsprechenden Stellen verarbeiten und die Microsekunden manuell aus dem String extrahieren, in Milliesekunden umrechnen und runden, weil ich im xml nur drei Stellen als Millisekunden haben will.
Hier ist die erste Irritation gegeben:
Die Zeit des Date-Objekts ist eine Stunde größer, als im Json, obwohl wir gemacht haben
Die Zeit ist dort bzgl. Tagen und Jahr korrekt, aber statt:
06:10:04.420, steht im Debugger im Date-Objekt:
07:10:04.420 UND beim Datum steht CET dabei, wobei CET doch nicht UTC ist, sondern meist UTC+1.
Danach baue ich mir ein XMLGregorianCalendar-Objekt je nach übergebener Zeitzone mit folgender Methode:
Ich übergebe da vorher erstellte Date-Objekt und die Zeitzone als String-ID - für folgende Zeitzonen als 2ter Übergabe-Parameter erhalte ich teils gewollte und teils verwirrende Ergebnisse:
1. "UTC" // 06:10:04.420 -> gewollt
2. "Europe/Berlin" // 07:10:04.420 -> gewollt
3. "UTC+01:00" // 06:10:04.420 -> nicht gewollt -> warum wird da nicht die Stunde um Eins erhöht
4. "UTC-1" // 06:10:04.420 -> nicht gewollt.
Interessant ist, wenn ich mir im Debugger die GregorianCalendar-Objekte ansehe, die zur Erzeugung der XMLGregorianCalendar-Objekte nötig sind, dann gibt es dort ein Feld 'zoneOffsets'.
Dieses ist nur bei timezone "Europ/Berlin": [36000000, 0],
sonst immer [0,0].
Das Unix-timestamp-Feld bei allen 4 GregorianCalendar-Objekten ergbit bei Umrechnung immer die Zeit 06:10:04.420 mit dem korrenten Datum.
Also
1. Scheint die Umrechnung bzgl. dem Offset bei dem GregorianCalendar-Objekten nicht zu stimmen, außer bei der übergebenen Zeitzone "Europ/Berlin".
2. Ich bin verwirrt, warum das Date-Objekt, war wir zu Beginn holen in CET ist, also 1 Stunde mehr, als im Json, aus dem wir lesen.
Evtl. kennt sich Jemand ja bei den Klassen SimpleDateFormat, GregorianCalendar, etc. aus und kann weiterhelfen.
Lg
Zrebna
Die Ausgangslage ist, dass ich einen Time_stamp aus einem JSON in ein XML schreiben will.
JSON:
JSON:
"VALID_FROM": "2023-05-15T06:10:04.4200000Z"
Im Json ist die UTC-Zeit (z.B. England) gegeben, daher hole ich mir erstmal das Date-Objekt.
An bestimmten Stelle nicht wundern, denn SimpleDateFormat kann nicht Mikrosekunden handeln, daher muss man den Time-String auf dem json an entsprechenden Stellen verarbeiten und die Microsekunden manuell aus dem String extrahieren, in Milliesekunden umrechnen und runden, weil ich im xml nur drei Stellen als Millisekunden haben will.
Java:
Date date = getDateFromJson(jsonFile);
private Date getDateFromJson(JsonObject ciJo) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String validFrom = ciJo.get("VALID_FROM").getAsString();
String processedValidFrom = getProcessedValidFromString(validFrom);
return sdf.parse(processedValidFrom);
}
private static String getProcessedValidFromString(String validFrom) {
// Extrahiere Mikrosekunden und wandle sie in Millisekunden um
int microSeconds = Integer.parseInt(validFrom.substring(20, 26)); // Nimm sechs Stellen für Mikrosekunden
int milliSeconds = Math.round(microSeconds / 1000f); // Konvertiere Mikrosekunden zu Millisekunden durch Rundung
// Erstelle das neue Datum mit den gerundeten Millisekunden
String processedValidFrom = validFrom.substring(0, 20) + String.format("%03d", milliSeconds) + "Z";
return processedValidFrom;
}
Hier ist die erste Irritation gegeben:
Die Zeit des Date-Objekts ist eine Stunde größer, als im Json, obwohl wir gemacht haben
Java:
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Die Zeit ist dort bzgl. Tagen und Jahr korrekt, aber statt:
06:10:04.420, steht im Debugger im Date-Objekt:
07:10:04.420 UND beim Datum steht CET dabei, wobei CET doch nicht UTC ist, sondern meist UTC+1.
Danach baue ich mir ein XMLGregorianCalendar-Objekt je nach übergebener Zeitzone mit folgender Methode:
Java:
private XMLGregorianCalendar createXmlCalendarByTimezone(Date date, String timezone) throws DatatypeConfigurationException {
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone(timezone));
cal.setTime(date);
XMLGregorianCalendar xCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
cal.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
return xCal;
}
Ich übergebe da vorher erstellte Date-Objekt und die Zeitzone als String-ID - für folgende Zeitzonen als 2ter Übergabe-Parameter erhalte ich teils gewollte und teils verwirrende Ergebnisse:
1. "UTC" // 06:10:04.420 -> gewollt
2. "Europe/Berlin" // 07:10:04.420 -> gewollt
3. "UTC+01:00" // 06:10:04.420 -> nicht gewollt -> warum wird da nicht die Stunde um Eins erhöht
4. "UTC-1" // 06:10:04.420 -> nicht gewollt.
Interessant ist, wenn ich mir im Debugger die GregorianCalendar-Objekte ansehe, die zur Erzeugung der XMLGregorianCalendar-Objekte nötig sind, dann gibt es dort ein Feld 'zoneOffsets'.
Dieses ist nur bei timezone "Europ/Berlin": [36000000, 0],
sonst immer [0,0].
Das Unix-timestamp-Feld bei allen 4 GregorianCalendar-Objekten ergbit bei Umrechnung immer die Zeit 06:10:04.420 mit dem korrenten Datum.
Also
1. Scheint die Umrechnung bzgl. dem Offset bei dem GregorianCalendar-Objekten nicht zu stimmen, außer bei der übergebenen Zeitzone "Europ/Berlin".
2. Ich bin verwirrt, warum das Date-Objekt, war wir zu Beginn holen in CET ist, also 1 Stunde mehr, als im Json, aus dem wir lesen.
Evtl. kennt sich Jemand ja bei den Klassen SimpleDateFormat, GregorianCalendar, etc. aus und kann weiterhelfen.
Lg
Zrebna
Zuletzt bearbeitet: