Подтвердить что ты не робот

JDBC ResultSet: мне нужен getDateTime, но есть только getDate и getTimeStamp

Я хотел бы получить столбец 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, Тим

4b9b3361

Ответ 1

java.util.Date date;
Timestamp timestamp = resultSet.getTimestamp(i);
if (timestamp != null)
    date = new java.util.Date(timestamp.getTime()));

Затем отформатируйте его так, как вам нравится.

Ответ 2

Ответ Leos Literak является правильным.

Подробнее

Кажется, вы вводите в заблуждение три набора типов данных, связанных с датой:

  • Стандартные типы SQL
  • Собственные типы
  • Типы JDBC

Стандарт SQL определяет пять типов:

Дата-только

  • DATE
    Только дата, время, часовой пояс.

Time-of-Day-только

  • TIME или TIME WITHOUT TIME ZONE
    Только время, нет даты. Молчаливо игнорирует любой часовой пояс, указанный как часть ввода.
  • TIME WITH TIME ZONE (или TIMETZ)
    Только время, нет даты. Применяет правила часового пояса и летнего времени, если к вводу прилагаются достаточные данные. Из сомнительной полезности, учитывая другие типы данных, как обсуждается в документе Postgres.

Дата и время суток

  • TIMESTAMP или TIMESTAMP WITHOUT TIME ZONE
    Дата и время, но игнорирует часовой пояс. Любая информация о часовом поясе, передаваемая в базу данных, игнорируется без настройки на UTC. Таким образом, этот не представляет определенный момент на временной шкале, а представляет собой ряд возможных моментов в течение примерно 26-27 часов. Используйте это, если часовой пояс или смещение (a) неизвестны или (b) неактуальны, такие как "Все наши заводы по всему миру закрываются в полдень на обед". Если у вас есть какие-то сомнения, скорее всего, правильный тип.
  • TIMESTAMP WITH TIME ZONE (или TIMESTAMPTZ)
    Дата и время с учетом часового пояса. Обратите внимание, что это имя является чем-то неправильным в зависимости от реализации. Некоторые системы могут хранить данные данного часового пояса. В других системах, таких как Postgres, информация о часовом поясе не сохраняется, вместо этого информация о часовом поясе, переданная база данных используется для настройки даты-времени на UTC.

Собственные типы сильно различаются.

Платформа Java обрабатывает внутренние данные даты-времени по-другому, чем стандартные или конкретные базы данных SQL. Задача драйвера JDBC заключается в том, чтобы посредничать между этими различиями, действовать как мост, переводить типы и их фактические реализованные значения данных по мере необходимости. java.sql. * Package - это мост.

До Java 8 спецификация JDBC определила 3 ​​типа для работы с датой. Первые два являются хаками, как и до Версии 8, Java не имеет классов, чтобы представлять только дату или значение времени.

  • java.sql.Date
    Имитирует только дату, делает вид, что у него нет времени, нет часового пояса. Может быть запутанным, поскольку этот класс является оберткой вокруг java.util.Date, которая отслеживает дату и время. Внутренне, временная часть установлена ​​на ноль (полуночный UTC).
  • java.sql.Time
    Только время, притворяется, что у него нет даты и нет часового пояса. Также может быть запутанным, так как этот класс также представляет собой тонкую оболочку вокруг java.util.Date, которая отслеживает дату и время. Внутренне дата установлена ​​на ноль (1 января 1970 г.).
  • java.sql.TimeStamp
    Дата и время, но нет часового пояса. Это тоже тонкая оболочка вокруг java.util.Date.

Так что ответ на ваш вопрос относительно метода "getDateTime" в интерфейс ResultSet. Этот интерфейс предлагает методы getter для трех типов данных моста, определенных в JDBC:

Обратите внимание, что во всех трех случаях JDBC не отслеживает часовой пояс. Обычная практика заключается в том, чтобы конвертировать ваши даты в UTC/GMT (без смещения часового пояса) и хранить их таким образом. Драйвер JDBC может сделать это для вас.

Joda времени

До 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

Ответ 3

это сработало:

    Date date = null;
    String dateStr = rs.getString("doc_date");
    if (dateStr != null) {
        date = dateFormat.parse(dateStr);
    }

с помощью SimpleDateFormat.