Разобрать строку временной метки в Java.sql.timestamp

У меня есть следующая метка времени в формате String

2019-04-06T00:43:21+00:00
2019-04-04T21:24:33+00:00
2019-04-04T21:02:16+00:00

Как я могу разобрать приведенные выше строки временных меток на Java.sql.timestamp?

Я рекомендую вам не использовать java.sql.Timestamp. Этот класс плохо спроектирован, сбивает с толку и давно устарел. Для использования с базой данных SQL в зависимости от типа данных SQL и возможностей вашего драйвера JDBC вместо этого используйте Instant, OffsetDateTIme или LocalDateTime, все из java.time, современный API даты и времени Java.

Ole V.V. 06.04.2019 20:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
1 991
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте DateFormat для анализа вашей строки.

 try{
     String x = "2019-04-04T21:24:33+00:00";
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssX");
     Date date = (Date) df.parse(x);
     java.sql.Timestamp timeStamp = new java.sql.Timestamp(date.getTime());
 }catch(ParseException pe){
     pe.printStackTrace();
 }

Как упоминалось другими в комментариях, есть более обновленный способ сделать это.

String time = "2019-04-04T21:02:16+00:00";
OffsetDateTime odt=OffsetDateTime.parse(time,DateTimeFormatter.ISO_OFFSET_DATE_TIME);
java.sql.Timestamp timestamp=new java.sql.Timestamp(odt.toEpochSecond()*1000);
stackoverflow.com/questions/12781273/…
Sandeep Polamuri 06.04.2019 19:11

Эти ужасные классы были вытеснены много лет назад современными классами Java.время после принятия JSR 310. Предлагать Date, Timestamp и SimpleDateFormat в 2019 году — плохой совет.

Basil Bourque 06.04.2019 20:38

Пожалуйста, не учите молодежь использовать давно устаревший и заведомо проблемный класс SimpleDateFormat. По крайней мере, не в качестве первого варианта. И не без оговорок. Сегодня у нас намного лучше в java.time, современный API даты и времени Java и его DateTimeFormatter.

Ole V.V. 06.04.2019 20:56

тл;др

Timestamp                                   // Avoid this terrible legacy class if possible. Represents a moment in UTC. 
.from(                                      // Convert from modern `Instant` to legacy `Timestamp`. No data loss, as both resolve to nanoseconds.
    OffsetDateTime                          // Modern way to represent a moment with an offset-from-UTC (hours, minutes, and seconds).
    .parse( "2019-04-06T00:43:21+00:00" )   // Parse standard ISO 8601 strings. Returns a `java.time.OffsetDateTime` object.
    .toInstant()                            // Extract an `Instant` from the `OffsetDateTime`, thereby adjusting to UTC (an offset of zero). 
)                                           // Returns a `Timestamp` object, if needed to interoperate with old code not yet updated to *java.time*. 

А еще лучше вообще пропустить этот ужасный Timestamp урок.

myPreparedStatement.setObject(                           // As of JDBC 4.2 and later, exchange *java.time* objects with your database.
    1 ,                                                  // Specify the nth placeholder in your SQL statement. 
    OffsetDateTime.parse( "2019-04-06T00:43:21+00:00" )  // Parse an ISO 8601 compliant string as a `OffsetDateTime` object, a moment with an offset-from-UTC. Pass to the database via the `setObject` call.
)

OffsetDateTime

Ваши входные строки указывают смещение от UTC (количество часов-минут-секунд), эта часть в конце.

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

OffsetDateTime odt = OffsetDateTime.parse( "2019-04-06T00:43:21+00:00" ) ;

java.sql.Timestamp

Никогда не используйте java.util.Timestamp. Этот ужасный класс был вытеснен много лет назад современными классами Java.время.

Если вам необходим объект Timestamp для взаимодействия со старым кодом, еще не обновленным до Java.время, преобразуйте его, вызвав новые методы, добавленные к старым классам. Извлеките Instant из OffsetDateTime (тем самым изменив любое смещение на смещение нуля для самого UTC). Передайте объект InstantTimestamp.from.

java.sql.Timestamp ts = Timestamp.from( odt.toInstant() ) ;

JDBC 4.2

Начиная с JDBC 4.2, мы можем обмениваться объектами Java.время с базой данных.

myPreparedStatement.setObject( … , odt ) ;

Поиск.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Все это уже много раз освещалось на Stack Overflow. Так что ищите дополнительную информацию. И впредь тщательно ищите, прежде чем публиковать.


О Java.время

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

Чтобы узнать больше, см. Учебник по оракулу. И поищите множество примеров и пояснений в Stack Overflow. Спецификация JSR 310.

Проект Джода-Время, теперь именуемый Режим технического обслуживания, рекомендует перейти на классы Java.время.

Вы можете обмениваться объектами Java.время напрямую с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в классах java.sql.*.

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

  • Ява SE 8, Ява SE 9, Ява SE 10, Ява SE 11 и более поздние версии — часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Ява SE 6 и Ява SE 7
    • Большая часть функциональности Java.время обратно перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Андроид
    • Более поздние версии реализации пакетов Android классов Java.время.
    • Для более ранних версий Android (<26) проект тридесятьABP адаптирует ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP….

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

Другие вопросы по теме