Ich versuche, von java.sql.timestamp
zu OffsetDateTime
zu konvertieren, so dass ich ISO8601
Standard-String in meinem Rest API zurückgeben kann. Ich verwende diesen Code aus timestamp
zu OffsetDateTime
Ungültige ID für ZoneOffset
public static OffsetDateTime sqlTimetampeToOffsetDateTime(Timestamp ts, String timeZone)
{
if (ts == null)
{
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(ts);
ZoneOffset offset = ZoneOffset.of(timeZone);
return OffsetDateTime.of(
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1,
cal.get(Calendar.DAY_OF_MONTH),
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
cal.get(Calendar.SECOND),
cal.get(Calendar.MILLISECOND)*1000000,
offset);
}
jedoch zu konvertieren, schlägt der Code bei ZoneOffset offset = ZoneOffset.of(timezone)
für Wert Europe/Copenhagen
.
habe ich folgende Code Liste aller Zeitzonen zu drucken, und ich sehe Europe/Copenhagen
in dieser Liste
Set<String> allZones = ZoneId.getAvailableZoneIds();
LocalDateTime dt = LocalDateTime.now();
List<String> zoneList = new ArrayList<String>(allZones);
Collections.sort(zoneList);
for (String s : zoneList) {
ZoneId zone = ZoneId.of(s);
ZonedDateTime zdt = dt.atZone(zone);
ZoneOffset offset = zdt.getOffset();
int secondsOfHour = offset.getTotalSeconds() % (60 * 60);
String out = String.format("%35s %10s%n", zone, offset);
System.out.printf(out);
}
Jetzt verstehe ich nicht, was los ist. Wie kann ich java.sql.timestamp
-ISO8601
String konvertieren (i do not care, wenn ich OffsetDateTime
oder nicht verwenden. Ich würde es vorziehen, keine dritte Partei Bibliothek
Was ist Ihr Datentyp in Ihrer Datenbank? Timestamp mit Zeitzone? Etwas anderes? – Tunaki
In der Datenbank habe ich Zeitstempel, z. B. "2016-05-23 15: 00: 00.0" und ich habe eine andere Spalte mit Zeitzone, z. B. "Europa/Kopenhagen". Deshalb übergebe ich 'timezone' als separate Zeichenfolge. –
Der Ausdruck 'ZoneOffset.of (" Europe/Copenhagen ")' muss fehlschlagen, da diese Zonen-ID NICHT nur ein Offset ist (enthält zusätzliche Informationen wie Sommerzeit-Regeln). In diesem Fall müssen Sie zunächst eine 'ZonedDateTime' konstruieren und daraus eine' OffsetDateTime' oder eine 'Instant' ableiten. –