2016-04-29 12 views
1

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 OffsetDateTimeUngü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

http://pastebin.com/eHJKWpAv

+0

Was ist Ihr Datentyp in Ihrer Datenbank? Timestamp mit Zeitzone? Etwas anderes? – Tunaki

+0

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

+0

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

Antwort

-1

schaffst ich hätte zu verwenden, um es zu konvertieren, aber ich bin nicht sicher, ob es der richtige Weg ist, so zu tun oder nicht. Hier ist mein Code für jemand anderes, der

public static OffsetDateTime sqlTimetampeToOffsetDateTime(Timestamp ts, String timeZone) 
{ 
    if (ts == null) 
    { 
     return null; 
    } 

    ZoneId zoneId = ZoneId.of(timeZone); 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(ts); 
    ZonedDateTime zdt = ZonedDateTime.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, 
      zoneId); 
    return zdt.toOffsetDateTime(); 
} 

für die Antwort sucht Wo timeZone in Form von Europe/Copenhagen ist ... können Sie das sehen vollständige Liste, die von Java8 in m unterstützt wird y Pastebin url in Frage gestellt

+0

Ich denke 'return ts.toInstant(). AtZone (ZoneId.of (timeZone)). ToOffsetDateTime();' ist alles was benötigt wird. – Tunaki

+0

Ihr Code fügt Offset zur resultierenden Zeit hinzu. Ich wollte es nur hier schreiben, damit jemand, der gerade liest, den Unterschied kennt. –

+0

Okay, dann ist es 'ts.toLocalDateTime(). AtZone (ZoneId.of (timeZone)). ToOffsetDateTime();'. – Tunaki

0

Wenn Sie die Zonen-ID haben, ist es ziemlich einfach, die Instant-Klasse zu verwenden, um dies zu tun:

Timestamp t = new Timestamp(System.currentTimeMillis()); 

ZoneId zone = ZoneId.of("Europe/Copenhagen"); 

OffsetDateTime offsetDateTime = ZonedDateTime 
    .ofInstant(Instant.ofEpochMilli(t.getTime()), zone) 
    .toOffsetDateTime(); 
0

ZoneOffset macht nur Sinn, wenn sie mit einem bestimmten Zeitpunkt zu tun. In Europa/London verwenden wir derzeit je nach Jahreszeit entweder BST oder GMT. Vor 100 Jahren (geben oder nehmen) hatte Europe/London jedoch keine BST. ZoneOffset.of() ruft nur Zonenoffsets aus einem internen Cache ab, der nur gefüllt wird, wenn ZoneOffset.ofTotalSeconds() aufgerufen wird. Dies ist schlecht dokumentiert. Jedoch eine einfache Lösung besteht:

ZoneId.of("Europe/London").getRules().getOffset(Instant.now()); 

, die die korrekte ZoneOffset für Europa/London kehrt für jetzt (zum Beispiel heute)

Verwandte Themen