Как преобразовать DateTimeFormatter в формат отметки времени sql - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь вставить DateTimeFormatter в Timestamp в моей таблице Tab1, используя JDB C,

String d="2020-03-19T21:19:32:921Z";
 DateTimeFormatter dateTimeFormatterUtc = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss:SSSr3");
 DateTime tD = dateTimeFormatterUtc.parseDateTime(d);
 I have set the date into my dao
 dao.setTRD(transactionOpenDateTime);


 String INSERT_AUDIT_SQL1= "insert into Tab1 (TD) value (?);";
 PreparedStatement preparedStatement = con.prepareStatement(INSERT_AUDIT_SQL1);
 preparedStatement.setDate(1,(Date) dao.getTRD().toDate());

Я получаю ошибку, как показано ниже

java.lang.IllegalArgumentException: Invalid format: "2020-04-16T08:12:16.016+05:30[Asia/Calcutta]" is malformed at ".016+05:30[Asia/Calcutta]"
Exception in thread "main" java.lang.NullPointerException
    at com.manthan.dao.ConnectionDao.main(ConnectionDao.java:60)

1 Ответ

1 голос
/ 16 апреля 2020

Ваш пример ввода не соответствует значению, указанному в вашем сообщении об ошибке:

  • "2020-03-19T21:19:32:921Z" - ваш заданный ввод.
  • "2020-04-16T08:12:16.016+05:30[Asia/Calcutta]" сообщается в вашем сообщении об ошибке.

Вы слишком усердно работаете.

Оба значения в вашем примере соответствуют стандарту ISO 8601 . Классы java .time по умолчанию используют эти стандартные форматы при разборе / генерации текста. Поэтому нет необходимости указывать шаблон форматирования.

Instant Instant = Instant.parse( "2020-03-19T21:19:32:921Z" ) ;

ZonedDateTime zdt = ZonedDateTime.parse( "2020-04-16T08:12:16.016+05:30[Asia/Calcutta]" ) ;

Похоже, вы смешиваете устаревшие классы даты и времени, включенные в самые ранние версии Java вместе с Joda-Time . Вместо этого вы должны использовать java .time классы, которые официально вытеснили как унаследованные классы, так и Joda-Time .

Вместо передачи java.util.Date в PreparedStatement::setDate, передача java .time объектов в setObject.

JDB C 4.2 требуется поддержка OffsetDateTime но, как ни странно, не более часто используемые Instant или ZonedDateTime. Так что конвертируй.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
OffsetDateTime odt = zdt.toOffsetDateTime() ;

myPreparedStatement.setObject( … , odt ) ;

Вы сказали:

Я пытаюсь вставить DateTimeFormatter в метку времени

DateTimeFormatter для создания текста, который представляет значение в объекте даты и времени. Этот класс не имеет никакого отношения к обмену информацией с базой данных.

Класс java.sql.Timestamp является одним из тех устаревших классов даты и времени, которые вы больше не должны использовать. Заменено на OffsetDateTime (и, необязательно, Instant).


О java .time

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

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

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классов.

Вы можете обмениваться java .time объектами напрямую с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.* классах. Поддержка Hibernate 5 и JPA 2.2 java .time .

Где взять java .time классы?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздних версий - часть стандартного API Java со связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большинство функций java .time перенесено на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android комплектных реализаций классов java .time .
    • Для более ранних Android (<26) <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упомянуто выше). См. Как использовать ThreeTenABP… .
...