Ответ 1
java.util.Date date;
Timestamp timestamp = resultSet.getTimestamp(i);
if (timestamp != null)
date = new java.util.Date(timestamp.getTime()));
Затем отформатируйте его так, как вам нравится.
Я хотел бы получить столбец DATETIME из таблицы Oracle DB с JDBC. Вот мой код:
int columnType = rsmd.getColumnType(i);
if(columnType == Types.DATE)
{
Date aDate = rs.getDate(i);
valueToInsert = aDate.toString();
}
else if(columnType == Types.TIMESTAMP)
{
Timestamp aTimeStamp = rs.getTimestamp(i);
valueToInsert = aTimeStamp.toString();
}
else
{
valueToInsert = rs.getString(i);
}
Мне нужно сначала определить тип столбца. Поле, которое меня интересует, распознается как Type.DATE, но оно действительно DATETIME в БД, поскольку оно имеет этот формат: "07.05.2009 13:49:32"
getDate усекает время: "07.05.2009" и getString добавляет ".0" к нему: "07.05.2009 13: 49: 32.0"
Конечно, я мог бы просто удалить окончательный файл .0 и работать с getString все время, но это грязное решение.
Любые идеи? Я искал метод getDateTime.
Cheers, Тим
java.util.Date date;
Timestamp timestamp = resultSet.getTimestamp(i);
if (timestamp != null)
date = new java.util.Date(timestamp.getTime()));
Затем отформатируйте его так, как вам нравится.
Ответ Leos Literak является правильным.
Кажется, вы вводите в заблуждение три набора типов данных, связанных с датой:
Стандарт SQL определяет пять типов:
DATE
TIME
или TIME WITHOUT TIME ZONE
TIME WITH TIME ZONE
(или TIMETZ
) TIMESTAMP
или TIMESTAMP WITHOUT TIME ZONE
TIMESTAMP WITH TIME ZONE
(или TIMESTAMPTZ
) Собственные типы сильно различаются.
Платформа Java обрабатывает внутренние данные даты-времени по-другому, чем стандартные или конкретные базы данных SQL. Задача драйвера JDBC заключается в том, чтобы посредничать между этими различиями, действовать как мост, переводить типы и их фактические реализованные значения данных по мере необходимости. java.sql. * Package - это мост.
До Java 8 спецификация JDBC определила 3 типа для работы с датой. Первые два являются хаками, как и до Версии 8, Java не имеет классов, чтобы представлять только дату или значение времени.
Так что ответ на ваш вопрос относительно метода "getDateTime" в интерфейс ResultSet. Этот интерфейс предлагает методы getter для трех типов данных моста, определенных в JDBC:
getDate
для java.sql.DategetTime
для java.sql.TimegetTimestamp
для java.sql.TimestampОбратите внимание, что во всех трех случаях JDBC не отслеживает часовой пояс. Обычная практика заключается в том, чтобы конвертировать ваши даты в UTC/GMT (без смещения часового пояса) и хранить их таким образом. Драйвер JDBC может сделать это для вас.
До Java 8 (пакет java.time. *) классы даты и времени в комплекте с java (java.util.Date и Calendar, java.text.SimpleDateFormat), как известно, являются неприятными, запутанными и ошибочными.
Лучшая практика - взять то, что дает ваш драйвер JDBC, и создавать объекты Joda-Time, или в Java 8, java.time. * пакет, В конце концов вы должны увидеть новые драйверы JDBC, которые автоматически будут использовать новые классы java.time. *. До тех пор некоторые методы были добавлены в классы, такие как java.sql.Timestamp для interject с java.time, например toInstant
и fromInstant
.
Что касается последней части вопроса, рендеринг String... Для формирования строкового значения должен использоваться объект форматирования.
Старомодным способом является java.text.SimpleDateFormat. Не рекомендуется.
Joda-Time предоставляет различные встроенные форматы, и вы также можете определить свои собственные. Но для записи журналов или отчетов, как вы упомянули, лучшим выбором может быть формат ISO 8601. Этот формат используется по умолчанию Joda-Time и java.time.
//java.sql.Timestamp timestamp = resultSet.getTimestamp(i);
// Or, fake it
// long m = DateTime.now().getMillis();
// java.sql.Timestamp timestamp = new java.sql.Timestamp( m );
//DateTime dateTimeUtc = new DateTime( timestamp.getTime(), DateTimeZone.UTC );
DateTime dateTimeUtc = new DateTime( DateTimeZone.UTC ); // Defaults to now, this moment.
// Convert as needed for presentation to user in local time zone.
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");
DateTime dateTimeZoned = dateTimeUtc.toDateTime( timeZone );
Дамп для консоли...
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeZoned: " + dateTimeZoned );
При запуске...
dateTimeUtc: 2014-01-16T22:48:46.840Z
dateTimeZoned: 2014-01-16T23:48:46.840+01:00
это сработало:
Date date = null;
String dateStr = rs.getString("doc_date");
if (dateStr != null) {
date = dateFormat.parse(dateStr);
}
с помощью SimpleDateFormat.