Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с sql.Timestamp 
:(
    Опции темы
Ares4322
Дата 19.5.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



Доброго времени суток!
В моей программе сервлет вытаскивает с БД PostgreSQL данные типа Timestamp without TZ. Эти данные пересылаются на клиента в JSON в формате микросекунд с 1970 года. 
Код

map.put("eventTimestamp", new Date(rs.getTimestamp("event_time").getTime()).toString());

Данные в БД лежат в UTC. getTime() возвращает время тоже в UTC. 
Проблема в том, что при размещении кода на сервере в другом часовом поясе количество микросекунд отличается от нашего часового пояса, хотя getTime() по документации возвращает UTC. 
Почему так происходит?
PM MAIL   Вверх
LSD
Дата 19.5.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Потому что это:
Код

new Date(rs.getTimestamp("event_time").getTime()).toString()

полная ересь!

Если сервер тоже на Java, то просто передавай long с милисекундами. Если нет то читай эту тему.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ares4322
Дата 19.5.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



Прощу прощения. не то прислал.
Код

rs.getTimestamp("event_time").getTime()

Приведенный выше код использовал для попыток понять, как оно работает.
PM MAIL   Вверх
LSD
Дата 19.5.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Ares4322 @  19.5.2010,  08:57 Найти цитируемый пост)
Проблема в том, что при размещении кода на сервере в другом часовом поясе количество микросекунд отличается от нашего часового пояса

Если на двух серверах одновременно вызвать System.currentTimeMillis() то они должны вернуть одинаковые значения. Если это не так, то надо проверить:
1. Время на серверы выставлено точно.
2. Часовые пояса в системе и JVM указанны верно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
amigooo
Дата 19.5.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



В базе у вас по сути long, такой каким вы его положили, при вытаскивании никакого другого способа как использовать local timezone у драйвера нету, потом этот лонг в из local timezone вы видите в UTC преобразованным. 
либо устанавливайте timezone в jvm, либо используйте getTimestamp(int columnIndex, Calendar cal)  либо другой тип данных для базы.

Это сообщение отредактировал(а) amigooo - 19.5.2010, 14:17
PM MAIL   Вверх
Ares4322
Дата 19.5.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



в базе у меня Timestamp without TZ. по сути лежит там UTC. Я вытаскиваю миллисекунды с помощью
Код

rs.getTimestamp("event_time").getTime()

и на серверах в разных часовых поясах этот метод для одного и того же значения из БД покажет разные значения
PM MAIL   Вверх
LSD
Дата 19.5.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Ares4322 @  19.5.2010,  18:06 Найти цитируемый пост)
в базе у меня Timestamp without TZ. по сути лежит там UTC

Откуда такая уверенность что там лежит время в UTC? Тип поля в базе какой Timestamp или Number?

Скорее всего драйвер трактует Timestamp СУБД как время в локальной зоне сервера. Т.е. из базы читается время в неком внутреннем формате, преобразуется в компоненты (год, месяц, день и т.д.) а дальше с помощью Calendar получается long и из него уже создается java.sql.Timestamp. А Calendar по умолчанию как раз и использует локальную TZ.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ares4322
Дата 19.5.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

Репутация: 1
Всего: 3



Тип поля Timestamp. А уверенность, потому что я туда кладу время в UTC и лежит там UTC
PM MAIL   Вверх
LSD
Дата 19.5.2010, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Ты кладешь туда java.sql.Timestamp который не имеет TimeZone. У сервера какая TimeZone установлена?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
amigooo
Дата 20.5.2010, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.