, Что делает код, унаследованный код?
Как с простым наследием, когда автор мертв или пропавшие без вести, Вы как наследник получаете все или часть его кода.
Вы проливаете некоторые слезы и попытку выяснить, что сделать со всем этим мусором.
В этом разница между Timestamp и другими временными типами в MySQL. Временная метка сохраняется как Unix time_t в UTC, но другие типы хранят дату / время буквально без информации о зоне.
Когда вы вызываете getTimestamp (), драйвер MySQL JDBC преобразует время из GMT в часовой пояс по умолчанию, если тип - timestamp. Он не выполняет такого преобразования для других типов.
Вы можете изменить тип столбца или выполнить преобразование самостоятельно. Я рекомендую прежний подход.
Вы должны знать, что 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);
Из этого сообщения я пришел к выводу, что JDBC действительно извлекает часовой пояс для метки времени (я не
На днях я столкнулся с похожей проблемой, когда компонент времени был усечен с некоторых дат.
Мы сузили его до различия в версиях драйверов 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. Для обеспечения совместимости и продолжения работы приложений после обновления предусмотрен флаг совместимости. У разработчиков теперь есть несколько вариантов:
Драйвер 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, и все будет в порядке.