2016-07-25 6 views
-2

У меня есть строка «2016-07-21T21: 30: 47.492 + 0000» Я хочу сохранить ее в БД в столбце с типом данных «TIMESTAMP WITH TIMEZONE». Просьба предложить решение.Преобразование строки в «метку времени с часовым поясом» в java

Это то, что я сделал:

final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSX"); 
final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
final Date d1 = mdyFormat.parse(strDate); 
final String mdx = sdf.format(d1); 
+1

Какое программное обеспечение базы данных вы используете? –

+2

Что вы пробовали? Похоже, вы должны в основном разбирать строку, возможно, с помощью 'java.util.Date' или' java.time.Instant', а затем конвертировать в 'java.sql.Timestamp' и использовать это в' PreparedStatement'. –

+0

Жаба для Oracle –

ответ

0

Ваш код, имеющий одну проблему

String strDate = "2016-07-21T21:30:47.492+0000"; 
     final SimpleDateFormat mdyFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSX"); 
    // include `T` as well 

    final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
    final Date d1; 
      try { 
       d1 = mdyFormat.parse(strDate); 
// to add time zone you can use below line 
// sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
       String mdx = sdf.format(d1); 
       System.out.println(mdx); 
      } catch (ParseException ex) { 

      } 

Выход без sdf.setTimeZone(TimeZone.getTimeZone("UTC"))

22-07-2016

Выход с sdf.setTimeZone(TimeZone.getTimeZone("UTC"))

21-07-2016

TimeZone.getDefault() получает часовой пояс системы по умолчанию.

+0

Спасибо AJ. Это скорректировало дату. Но я все еще получаю вывод как 2016-07-21T21: 30: 47.492Z. Более того, сохраняя это в БД, я получаю ошибку «недействительный месяц». P.S - На стороне БД тип TIMESTAMP WITH TIMEZONE –

1

Вы используете неприятные старые классы, теперь вытесненные java.time-классами.

Вот как следует рекомендация Джона Скита, размещенная в комментарии к Вопросу.

java.time

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

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

Большая часть функциональности java.time портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.

OffsetDateTime

Вы можете разобрать, что входную строку в качестве OffsetDateTime объекта.

OffsetDateTime odt = OffsetDateTime.parse("2016-07-21T21:30:47.492+0000"); 

Если драйвер JDBC соответствует JDBC 4.2 или более поздней версией, вы можете быть в состоянии передать/выборки в SQL с помощью PreparedStatement::setObject и ResultSet::getObject методов. Если нет, перейдите в старый тип java.sql.

Для преобразования требуется объект Instant. Instant - это более базовый класс строительного блока в java.time, лишенный гибкости OffsetDateTime. Класс Instant представляет собой момент на временной шкале в UTC с разрешением до наносекунд. Извлеките Instant из этого OffsetDateTime.

Instant instant = odt.toInstant(); 

Пропустите Instant к новому способу добавленного к старому классу java.sql.

java.sql.Timestamp ts = java.sql.Timestamp.from(instant); 

Затем вызвать PreparedStatement::setTimestamp и ResultSet::getTimestamp методы.

myPreparedStatement.setTimestamp(1 , ts); 
… 
java.sql.Timestamp ts = myResultSet.getTimestamp(1); 

После извлечения в java.sql.Timestamp, немедленно преобразовать в класс java.time, Instant. Используйте классы java.sql только в тех случаях, когда в вашем JDBC-драйвере отсутствует прямая поддержка типов java.time, и даже тогда свести к минимуму использование классов java.sql. Работайте в своей бизнес-логике в java.time.

Instant instant = ts.toInstant(); 

Смешение имен классов

Не путайте два старых Date классов в комплекте с Java. java.util.Date представляет собой дату и время суток. A java.sql.Date предназначен для представления только даты-значения без времени суток (но запутывание на самом деле имеет время суток из-за неуклюжий взлома неудобного класса).

Избегайте java.util.Date и java.util.Calendar и java.text.SimpleDateFormat классов полностью. И минимизируйте использование классов java.sql.Date/.Time/.Timestamp, как описано выше.

+0

Ваш ответ спас меня! –

+0

@GauravKhare Хорошо, я рад. Обработка по времени - это сложная работа. Вы можете узнать больше, изучив больше вопросов и ответов о переполнении стека. Особенно обратите внимание на ответы [Jon Skeet] (https://stackoverflow.com/users/22656/jon-skeet) и ответы на них, касающиеся java.time. –

+0

Благодарим вас за то, что вы предлагаете эти сообщения, и вы правильно настроили дату, потому что для меня действительно очень сложно. –

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