ява sql дата время - PullRequest
       4

ява sql дата время

15 голосов
/ 16 декабря 2011

Когда я вставляю SQL DateTime в базу данных, я получаю 2007-02-07 12:00:00.00

Но я создал объект Date так: 2007-02-07 17:29:46.00

Как получить значение секунд в базе данных. Это всегда меняет его обратно на 12:00:00.00

date.setYear(Integer.valueOf(parsedDate[2].replaceAll(" ", "")) - 1900);
date.setMonth(Integer.valueOf(parsedDate[0].replaceAll(" ", "")));
date.setDate(Integer.valueOf(parsedDate[1].replaceAll(" ", "")));
...
java.sql.Date sqlDate = new java.sql.Date(date.getTime());

Должен ли я использовать какие-либо средства форматирования?

Ответы [ 2 ]

30 голосов
/ 16 декабря 2011

java.sql.Date представляет дату, а не дату и время. От документов :

Чтобы соответствовать определению SQL DATE, значения миллисекунд, обернутые экземпляром java.sql.Date, должны быть «нормализованы» путем установки часов, минут, секунд и миллисекунд на ноль в конкретном часовом поясе, с которым Экземпляр связан.

Если вы хотите сохранить дату и время, вам следует искать другой тип - например, java.sql.Timestamp. РЕДАКТИРОВАТЬ: Это не предполагает, что вы используете тип столбца TIMESTAMP - как paulsm4 говорит в комментариях, это совсем другое. Однако, насколько я вижу, JDBC поддерживает только:

  • Date (нет, вы тоже хотите время)
  • Time (нет, ты тоже хочешь свидание)
  • Timestamp (включает дату и время, но вам не нужна семантика SQL TIMESTAMP)

Я бы ожидал , используя тип Java Timestamp со столбцом DATETIME для работы, хотя и без уровня точности, который обеспечивает Timestamp.

РЕДАКТИРОВАТЬ: После небольшого исследования, похоже, что вы можете хотеть использовать тип java.sql.Time, но со специальными параметрами драйвера - по крайней мере, если вы используете драйвер Microsoft. См. Эти документы по настройке JDBC для получения дополнительной информации.

2 голосов
/ 24 мая 2018

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...