Niedawno odkryłem, że w zależności od używanego sterownika bazy danych, jOOQ może wykazywać dziwne zachowanie podczas parsowania DateTime. jOOQ zwraca datę przesunięcia jako Z (UTC), mimo że tak nie jest
W szczególności w moim przypadku użycie innego sterownika Postgres spowodowało, że DefaultBinding.java otrzymał obiekt kalendarza, który ma znacznik czasu, ale wywołał na nim toString w celu przetworzenia. Okazuje się, że toString nie wypisuje strefy czasowej, a następnie jOOQ wywnioskował, że była to strefa czasowa.
Dla mnie obraźliwe wiersze w DefaultBinding.java (użyłem znacznika czasu ze strefą czasową):
else if (type == OffsetDateTime.class) {
result = (T) offsetDateTime(ctx.resultSet().getString(ctx.index()));
}
Możesz być na innej linii w tej serii else ifs ze względu na brak strefy czasowej.
Podczas moich testów odkryłem również, że zmiana czasu systemowego zmieniła wynik, ale zmiana czasu sesji nic nie dała.
Na szczęście dla mnie przejście na standardowy sterownik Postgresa rozwiązało problem. Jeśli tak się nie stanie, zamierzałem przyjrzeć się przeciążeniu powiązania dla OffsetDateTime, aby naprawić użycie toString i skojarzone z nim usuwanie odpowiedniej strefy czasowej. Być może będziesz musiał podążać tą ścieżką, niestety, chyba że używasz sterownika SQL, który mógłby zostać uaktualniony lub zastąpiony. Możesz też zapisać go ze strefą czasową, a następnie przekonwertować na żądaną strefę czasową podczas ładowania z bazy danych.