Błąd odczytu czasu (current_time) z PostgreSQL

0

Witam, problem w skrócie wygląda następująco :

Baza : PostgreSQL - na Linixie, na innym komputerze
połączenie z programem w Java poprzez java.sql.Connection, program na Windowsie
pobieranie danych poprzez ResultSet.

Wykonuję kwerendę : SELECT ..... , cast(current_time AS time) as czas , .... FROM .... "

I tu zaczyna się problem :

Resultset.getTime("czas", calendar) na NIEKTÓRYCH KOMPUTERACH zwraca czas przesunięty o godzinę, w stosunku do czasu pobranego przez pgAdmin, a na niektórych pokazuje taki sam czas (ten przesunięty jest OK).

Np na moim kompie : jest teraz 1521 , program zwraca 1521 , pgAdmin pokazuje 1421 (bez cast pokazuje 1426.139748+00)
a na innym kompie program pokazuje 1421

Ustawiam zmienną calendar :
GregorianCalendar calendar = (GregorianCalendar) GregorianCalendar.getInstance(TimeZone.getTimeZone("CET"));

Ale jak widać nie jest to chyba brane pod uwagę (nie zawsze).

Wydaje mi się że jest problem z interpretowaniem stref czasowych (na komputerze i pobranej z serwera PostgreSQL) - ale nie jestem pewien

Będę wdzięczny za pomoc.

Pozdrawiam

0

Może to kwestia wypisywania.
Robisz to przez toString(), czy jakoś formaterem?

tzn. zmienna Calendar ma godzinę 1421, ale w innej strefie czasowej niż domyślna strefa komputera i przy wypisywaniu następuje konwersja na strefę użytkownika i w efekcie jest 1521

Porównaj ustawienia regionalne w systemie i domyślne locale na komputerach gdzie działa i gdzie nie działa.

Do wypisywania daty proponuję użyć (z wymuszeniem locale, które Ciebie interesują):
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#SimpleDateFormat%28java.lang.String,%20java.util.Locale%29

0

Pobieram to różnymi metodami : getObject() , getTime() , getString() - wynik jest ten ten sam.

Nie będzie to chyba sprawa Locale, bo w sumie nie chodzi język, format, itp ale o wartość - ale może się mylę.

Teraz przypomniałem sobie jeszcze jedną ciekawą rzecz. W zależności od kontekstu pobieram z bazy czas wykonania czegośtam (z pola typu Time), albo bieżący czas (current_time). Czas z tabeli wyświetlany jest prawidłowo (bez zmian). Current_time na niektórych komputerach wyświetlany jest bez zmian, a na niektórych jest przesunięty o godzinę. Sytuacja nie zmienia się nawet wtedy gdy używam getObject(), czyli jest on chyba zmieniany / nie zmieniany w trakcie pobierania. Chodzi więc chyba nie o interpretację pobranej wartości, a o jej wartość - czyli to co płynie z bazy, a nie jak to interpretować

Nie wiem czy nie trzeba czego ustawiać "przed" ResultSet (Connection, DataStore) albo "w" ResultSet. Niestety nie znalazłem żadnych tego typu pól w tych klasach.

Udało się rozwiązać problem : może komuś się przyda.

Problem rzeczywiście był w tworzeniu danych, a nie w ich interpretacji. Zamiast : SELECT ..... , cast(current_time AS time) as czas , .... FROM .... " , użyłem SELECT ..... , cast(current_time AT TIME ZONE 'CET' AS time) as czas , .... FROM .... " i wszystko działa jak należy

1 użytkowników online, w tym zalogowanych: 0, gości: 1