tl; dr
Вы, вероятно, смущены тем, что не понимаете, что java.util.Date
- это тип даты со временем, а его подкласс java.sql.Date
делает вид, что - только датакласс, но на самом деле его время суток установлено на ноль.Чертовски ужасный дизайн.Избегайте обоих этих классов полностью.Используйте java.time только классы.
Для столбца только с датой в вашей базе данных определите столбец как тип SQL-стандарта DATE
.
myPreparedStatement.setObject(
… ,
LocalDateTime.parse( "2007-02-07 17:29:46.00".replace( " " , "T" ) )
.toLocalDate()
)
java.time
Современный подход использует классы java.time , добавленные в Java 8 и более поздние версии.
Когда я вставляю SQL DateTime в базу данныхЯ получаю 2007-02-07 12: 00: 00.00
Нет такого понятия, как стандартный тип SQL, как DateTime
, и нет такого класса в Java.Так что я не знаю, каково ваше намерение.
Что касается входной строки, 2007-02-07 17:29:46.00
, проанализируйте ее как LocalDateTime
, потому что в ней нет индикатора часового пояса или смещения от UTC.
Этот формат в стиле SQL почти соответствует стандарту ISO 8601 .Чтобы полностью соответствовать, замените ПРОБЕЛ в середине на T
.Классы java.time по умолчанию используют форматы ISO 8601 при анализе / генерации строк.
String input = "2007-02-07 17:29:46.00".replace( " " , "T" ) ;
Parse.
LocalDateTime ldt = LocalDateTime.parse( input ) ;
A LocalDateTime
делает не представляет момент, не - точка на временной шкале.Он представляет потенциальные моменты в диапазоне около 26-27 часов.
Стандартный SQL действительно предлагает тип данных для такого значения, TIMESTAMP WITHOUT TIME ZONE
.
Смарт-объекты, а не тупые строки
Весь ваш подход неверен, спор текст и использование устаревших классов даты и времени.Вместо этого обменивайтесь java.time объектами.
Начиная с JDBC 4.2 вам больше не нужно использовать проблемные старые типы java.sql, такие как java.sql.Date
или java.sql.Timestamp
.Вы можете напрямую обмениваться объектами java.time с вашей базой данных с помощью setObject
/ getObject
методов.
myPreparedStatement.setObject( … , ldt ) ;
И извлечение.
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
Если вы пытаетесь работать с датойтолько значения, используйте стандартный тип SQL DATE
и класс Java LocalDate
.
LocalDate ld = ldt.toLocalDate() ;
myPreparedStatement.setObject( … , ld ) ;
Как получить значение секунд в базе данных
Не уверен, что вы подразумеваете под "значением секунд".
Возможно, вам нужно количество секунд от ссылки эпохи первого момента 1970 года в UTC.
long secondsSinceEpoch = ldt.toEpochSecond() ;
Если ваша цель была просто создать экземпляр java.sql.Date
не беспокойтесь.Никогда не используйте этот класс снова.Но, к вашему сведению, ваша конкретная проблема, скорее всего, является побочным эффектом ужасного дизайна, используемого для этого класса.Класс java.sql.Date
наследуется от java.util.Date
, который является типом даты-времени.java.sql.Date
class притворяется, что является значением только для даты, но на самом деле его время суток установлено на 00:00:00.Хуже того, документация говорит нам игнорировать тот факт, что он является подклассом.Не пытайтесь понять это;просто используйте java.time .
Если вы пытаетесь работать только с временем суток, извлеките объект LocalTime
.
LocalTime lt = ldt.toLocalTime() ;
Если вы хотите установить время суток в нули, то вам, скорее всего, нужно значение только для даты.Если это так, используйте класс LocalDate
для значения даты без времени суток и без часового пояса.
LocalDate ld = ldt.toLocalDate() :
Если вам нужен первый момент дня в эту дату, позвоните по телефонуLocalDate::atStartOfDay
.
LocalDateTime ldtStart = ldt.toLocalDate().atStartOfDay() ;
ОСТОРОЖНО: Если вы пытаетесь отследить фактические моменты, определенные точки на временной шкале, то весь этот код выше неверен.Поиск переполнения стека, чтобы узнать о Instant
, ZoneId
и ZonedDateTime
классах.Найдите в Stack Overflow и dba.StackExchange.com сведения о стандартном SQL-типе TIMESTAMP WITH TIME ZONE
.
About java.time
java.time Framework встроен в 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 .