Błąd odczytu czasu (current_time) z PostgreSQL

Błąd odczytu czasu (current_time) z PostgreSQL
P1
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 lat
  • Postów:28
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 15:56:21 , program zwraca 15:56:21 , pgAdmin pokazuje 14:56:21 (bez cast pokazuje 14:56:26.139748+00)
a na innym kompie program pokazuje 14:56:21

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

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
0

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

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

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


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 2x, ostatnio: __krzysiek85
P1
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 lat
  • Postów:28
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

edytowany 1x, ostatnio: pedro11

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.