tl; dr
Вставка / обновление.
myPreparedStatement.setObject(
… ,
Instant.parse( "2010-11-22 08:08:08.123456".replace( " " , "T" ) + "Z" )
) ;
Извлечение.
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
String output = ldt.toString().replace( "T" , " " ) ; // Remove the standard ISO 8601 format’s use of `T` in the middle with the SQL-style SPACE.
java.time
Java 8 приносит новый пакет java.time , чтобы заменить печально известные старые классы java.util.Date, .Calendar и SimpleDateFormat.Эти старые унаследованные классы ограничены разрешением в миллисекундах, в то время как ваша входная строка имеет микросекунды.Вы не можете втиснуть шесть десятичных знаков в тип данных, ограниченный тремя.
Значения даты и времени в java.time имеют разрешение наносекунда , что более чем достаточно для вашегомикросекунд.Это означает, что до девять десятичных знаков в течение доли секунды.
В JDBC 4.2 и более поздних версиях используйте класс Instant
напрямую.
Разбор входной строки.Для соответствия формату ISO 8601 , используемому по умолчанию в классах java.time, замените ПРОБЕЛ в середине на T
.Ваш приведенный пример должен исходить из столбца типа TIMESTAMP WITHOUT TIME ZONE
, что означает не определенный момент, не точку на временной шкале.
String input = "2010-11-22 08:08:08.123456".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
И еслиэтот ввод должен был быть моментом в UTC, добавьте Z
.Тогда у вас do есть момент, конкретная точка на временной шкале.Для использования с типом столбца TIMESTAMP WITH TIME ZONE
.
String input = "2010-11-22 08:08:08.123456".replace( " " , "T" ) + "Z" ;
Instant instant = Instant.parse( input ) ;
Отправьте в свою базу данных.
myPreparedStatement.setObject( … , instant ) ;
… и…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
О программе java.time
Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .
ОБНОВЛЕНИЕ: Проект Joda-Time теперь находится в режиме обслуживания , с командой, советующей перейти на классы java.time .Оставив этот раздел нетронутым, как историю.
Joda-Time
Как отмечалось выше, вам следует избегать использования классов java.util.Date, .Calendar и SimpleDateFormat.Начиная с Java 8 у вас есть выбор использования java.time или Joda-Time или обоих, поскольку у каждого из них есть свои сильные и слабые стороны.Joda-Time также работает в более ранних версиях Java.
Вы можете проанализировать эту строку, используя Joda-Time.
В качестве альтернативы, если у вас есть доступ к java.sql.Timestamp, который сгенерировал вашу строку, вы можете просто передать объект Timestamp в конструктор DateTime.Я предлагаю также передавать часовой пояс, поскольку объекты DateTime знают свой собственный назначенный часовой пояс.
DateTime dateTime = new DateTime( mySqlTimestamp, DateTimeZone.UTC );
или
DateTime dateTime = new DateTime( mySqlTimestamp, DateTimeZone.forID( "Europe/Paris" ) );
Joda-Time имеет разрешение миллисекунд.Таким образом, в любом случае, сгенерировав DateTime (разбор или прохождение), вы потеряете более мелкую долю секунды (игнорируется / усекается, не округляется).