У меня есть следующая метка времени в формате 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
?
Используйте 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);
Эти ужасные классы были вытеснены много лет назад современными классами Java.время после принятия JSR 310. Предлагать Date
, Timestamp
и SimpleDateFormat
в 2019 году — плохой совет.
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). Передайте объект Instant
Timestamp.from
.
java.sql.Timestamp ts = Timestamp.from( odt.toInstant() ) ;
Начиная с JDBC 4.2, мы можем обмениваться объектами Java.время с базой данных.
myPreparedStatement.setObject( … , odt ) ;
Поиск.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Все это уже много раз освещалось на Stack Overflow. Так что ищите дополнительную информацию. И впредь тщательно ищите, прежде чем публиковать.
Платформа Java.время встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые классы даты и времени наследие, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Чтобы узнать больше, см. Учебник по оракулу. И поищите множество примеров и пояснений в Stack Overflow. Спецификация JSR 310.
Проект Джода-Время, теперь именуемый Режим технического обслуживания, рекомендует перейти на классы Java.время.
Вы можете обмениваться объектами Java.время напрямую с вашей базой данных. Используйте JDBC-драйвер, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в классах java.sql.*
.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных дополнений к java.time в будущем. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и более.
Я рекомендую вам не использовать
java.sql.Timestamp
. Этот класс плохо спроектирован, сбивает с толку и давно устарел. Для использования с базой данных SQL в зависимости от типа данных SQL и возможностей вашего драйвера JDBC вместо этого используйтеInstant
,OffsetDateTIme
илиLocalDateTime
, все из java.time, современный API даты и времени Java.