2016-11-11 6 views
1

Я пытаюсь сохранить дату в БД, но я получаю следующую ошибку. Я смущен, потому что я посылаю тот же формат, но по-прежнему бросает исключение:Java: Ошибка при сохранении значения даты в базе данных (Simpledataformat)

java.lang.IllegalArgumentException: Формат Отметка должна быть гггг-мм-дд чч: мм: сс [.fffffffff]

Если я пытаюсь в SQL Developer ниже в пути он работает отлично

to_date('01/01/1900', 'mm/dd/yyyy') 

Через Java я пытался делать, как показано ниже

Первый метод

SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
Date myDate = format1.parse("01/01/1900 00:00:00"); 

Второй метод

SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy"); 
Date myDate = format1.parse("01/01/1900"); 

Где я буду неправильно.

P.S: Пожалуйста, перед тем, как разметить его как дублирующее и остановить людей от ответа на вопрос, понять, что я что-то пробовал и получил ошибку.

+0

Вы можете показать нам часть своего кода, которая на самом деле пытается написать SQL-код – alainlompo

+0

@alainlompo: row = new STRUCT (myNewRon, getConnection(), атрибуты); – sTg

ответ

1

Ваш шаблон даты не совпадает.

Лучше использовать PreparedStatement, чтобы вы никогда не положились на преобразование строк.

2

Т.Л., д-р

myPreparedStatement.setObject(
    … , 
    LocalDate.parse( 
     "01/01/1900" , 
     DateTimeFormatter.ofPattern("dd/MM/uuuu") 
    ) 
) 

Подробности

Answer by Just another Java programmer правильно.

Кроме того, вы не должны использовать строки для передачи значений даты и времени с помощью базы данных. Используйте классы времени.

Современный способ - это классы java.time, вытесняющие неудобные устаревшие классы времени.

LocalDate

LocalDate класс представляет собой дату только значение без времени суток и без временной зоны.

Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Paris France - это новый день, пока еще «вчера» в Montréal Québec.

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Вы можете анализировать непосредственно из строки в стандартном формате ISO 8601.

LocalDate localDate = LocalDate.parse("2016-01-23"); 

Или укажите каждую деталь.

LocalDate localDate = LocalDate.of(2016, Month.JANUARY , 23); 

Чтобы разобрать другие форматы, используйте DateTimeFormatter класс.Поиск переполнения стека для многих примеров.

Database

Если JDBC driver соответствует JDBC 4.2 или позже, он должен быть в состоянии передать тип java.time с PreparedStatement::setObject и принести с ResultSet::getObject.

myPreparedStatement.setObject(… , localDate); 

... или ...

myPreparedStatement.setObject(… , localDate , JDBCType.DATE); 

Если ваш драйвер не так включен, падение назад к использованию java.sql.Date. Этот неудобный класс претендует на то, чтобы представлять значение только для даты (но на самом деле имеет компонент времени, установленный в полночь, который мы должны игнорировать). Чтобы преобразовать в/из java.time, посмотрите на новые методы, добавленные в старые классы.

java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); 

И переход в другую сторону.

LocalDate localDate = sqlDate.toLocalDate(); 

Перейдите на страницу PreparedStatement::setDate.

myPreparedStatement.setDate(… , sqlDate); 

О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (как упоминалось выше) для Android специально.
    • См. How to use….

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.

Смежные вопросы