JDBC проблемы Timestamp & Date GMT

, Что делает код, унаследованный код?

Как с простым наследием, когда автор мертв или пропавшие без вести, Вы как наследник получаете все или часть его кода.

Вы проливаете некоторые слезы и попытку выяснить, что сделать со всем этим мусором.

8
задан n002213f 2 October 2009 в 14:40
поделиться

4 ответа

В этом разница между Timestamp и другими временными типами в MySQL. Временная метка сохраняется как Unix time_t в UTC, но другие типы хранят дату / время буквально без информации о зоне.

Когда вы вызываете getTimestamp (), драйвер MySQL JDBC преобразует время из GMT в часовой пояс по умолчанию, если тип - timestamp. Он не выполняет такого преобразования для других типов.

Вы можете изменить тип столбца или выполнить преобразование самостоятельно. Я рекомендую прежний подход.

12
ответ дан 5 December 2019 в 08:53
поделиться

Вы должны знать, что java.util.Date (а также java.sql.Date и java.sql.Timestamp , которые являются подклассами java.util.Date ) ничего не знают о часовых поясах, или, скорее, они всегда находятся в формате UTC.

java.util.Date и его подклассы являются не чем иным, как контейнером для значения «количество миллисекунд с 01.01.1970, 12:00 AM UTC».

Чтобы отобразить дату в определенном часовом поясе, преобразуйте ее в строку, используя объект java.text.DateFormat . Установите часовой пояс для этого объекта, вызвав метод setTimeZone () . Например:

Date date = ...;  // wherever you get this from

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Make the date format show the date in CET (central European time)
df.setTimeZone(TimeZone.getTimeZone("CET"));

String text = df.format(date);
4
ответ дан 5 December 2019 в 08:53
поделиться

Из этого сообщения я пришел к выводу, что JDBC действительно извлекает часовой пояс для метки времени (я не

0
ответ дан 5 December 2019 в 08:53
поделиться

На днях я столкнулся с похожей проблемой, когда компонент времени был усечен с некоторых дат.

Мы сузили его до различия в версиях драйверов Oracle.

На Oracle. FAQ есть раздел об этом:


select sysdate from dual; ...while(rs.next())

До 9201 это будет возвращать: getObject для sysdate: java.sql.Timestamp <<<< getDate для sysdate: java.sql.Date getTimetamp для sysdate: java.sql.Timestamp

Начиная с 9201 года, будет возвращено следующее

getObject для sysdate: java.sql.Date <<<<< getDate для sysdate: java.sql.Date >> без изменений getTimetamp для sysdate: java.sql.Timestamp >> без изменений

Примечание: java.sql.Date не имеет временной части, тогда как java.sql.Timestamp имеет.

С этим изменением сопоставления Datatype некоторые приложения выйдут из строя и / или генерировать неверные результаты при обновлении драйвера JDBC с 8i / 9iR1 до 920x JBDC. Для обеспечения совместимости и продолжения работы приложений после обновления предусмотрен флаг совместимости. У разработчиков теперь есть несколько вариантов:

  1. Использовать флаг oracle.jdbc.V8Compatible.

Драйвер JDBC не определяет версию базы данных по умолчанию. Чтобы изменить флаг совместимости для обработки типов данных TIMESTAMP, для свойства соединения

'oracle.jdbc.V8Compatible'

можно установить значение 'true', и драйвер будет вести себя так же, как в 8i, 901x, 9 200 (по отношению к TIMESTAMPs).

По умолчанию флаг установлен в «false». В конструкторе OracleConnection драйвер получает версию сервера и соответствующим образом устанавливает флаг совместимости.

java.util.Properties prop=newjava.util.Properties(); 
prop.put("oracle.jdbc.V8Compatible","true"); 
prop.put("user","scott"); 
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid"; 
Connection conn = DriverManager.getConnection(url,prop);

В JDBC 10.1.0.x вместо свойства соединения можно использовать следующее системное свойство: java -Doracle.jdbc.V8Compatible = true .....Запись: Этот флаг является только клиентским флагом, который управляет сопоставлением отметок времени и даты. Это не влияет ни на какие функции базы данных.

'2. Используйте set / getDate и set / getTimestamp при работе с типами данных столбца Date и TimeStamp соответственно.

Сервер 9i поддерживает типы столбцов Date и Timestamp. DATE отображается в java.sql.Date, а TIMESTAMP отображается в java.sql.Timestamp. .


Итак, для моей ситуации у меня был такой код:

import java.util.Date; 
Date d = rs.getDate(1);

С 9i я получал java.sql.Timestamp (который является подклассом java.util.Date), так что все было круто, и у меня были часы и минут.

Но с 10g тот же код теперь получает java.sql.Date (также подкласс java.util.Date, поэтому он все еще компилируется), но HH: MM ОБРЕЗАНО !!.

Второе решение было для меня довольно простым - просто замените getDate на getTimestamp, и все будет в порядке.

3
ответ дан 5 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: