Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Jooq LocalDateTime-Felder verwenden die Systemzeitzone anstelle der Sitzungszeitzone

Ich habe kürzlich festgestellt, dass jOOQ je nach verwendetem Datenbanktreiber ein seltsames Verhalten beim DateTime-Parsing aufweisen kann. jOOQ gibt die Offset-Datumszeit als Z (UTC) zurück, obwohl dies nicht der Fall ist

Insbesondere in meinem Fall führte die Verwendung eines anderen Postgres-Treibers dazu, dass DefaultBinding.java ein Kalenderobjekt mit einem Zeitstempel erhielt, aber toString darauf aufrief, um es zu analysieren. Es stellte sich heraus, dass toString die Zeitzone nicht druckt, dann schlussfolgerte jOOQ, dass es sich um die Ortszeit handelte.

Für mich waren die anstößigen Zeilen in DefaultBinding.java (ich habe einen Zeitstempel mit Zeitzone verwendet):

else if (type == OffsetDateTime.class) {
    result = (T) offsetDateTime(ctx.resultSet().getString(ctx.index()));
}

Möglicherweise befinden Sie sich in dieser Reihe von Sonst-Wenns in einer anderen Zeile, da Sie keine Zeitzone haben.

Bei meinen Tests habe ich auch festgestellt, dass das Ändern der Systemzeit das Ergebnis verändert hat, aber das Ändern der Sitzungszeit hat nichts bewirkt.

Glücklicherweise löste ein Wechsel zum Standard-Postgres-Treiber das Problem. Wenn nicht, würde ich versuchen, die Bindung für OffsetDateTime zu überladen, um die Verwendung von toString und das damit verbundene Entfernen der relevanten Zeitzone zu beheben. Möglicherweise müssen Sie diesen Weg leider einschlagen, es sei denn, Sie verwenden ebenfalls einen SQL-Treiber, der aktualisiert oder ersetzt werden könnte. Oder Sie könnten es mit einer Zeitzone speichern und dann beim Laden aus der Datenbank in die gewünschte Zeitzone konvertieren.