Date.toString () - sql против используемых дат - PullRequest
1 голос
/ 23 ноября 2011

Мне нужно удалить время из Date объекта.Вот моя попытка,

Код:

System.out.println("date " + dbDate);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("formatter.format(dbDate) " + formatter.format(dbDate));
System.out.println("final " + formatter.parse(formatter.format(dbDate)));

Выход:

date 2011-12-03 23:59:59.0
formatter.format(dbDate) 2011-12-03
final Sat Dec 03 00:00:00 IST 2011

Хочу в финалдата для отображения в 2011-12-03.Но после преобразования toString() этого Date в другом формате.Я что-то упустил.Пожалуйста, помогите.

Обновление:

В моем приложении у меня есть два разных способа получить dbDate.EXPIRY_DATE столбец имеет тип DATE.

В первом запросе используется dbDate = (java.util.Date) rs.getDate("EXPIRY_DATE");.

Для этого dbDate, System.out.println("date " + dbDate); дает date 2011-12-03

Второй запрос использует dbDate = rs.getTimestamp("EXPIRY_DATE");

Для этого dbDate, System.out.println("date " + dbDate); дает date 2011-12-03 23:59:59.0.

Это моя проблема.Поскольку я думал, что toString() создает проблему, я не упомянул полную проблему.

Решение:

У меня не было выбора, чтобы избежать java.sql.Date, так каку моих методов применения есть многократное использование.Я попробовал ниже и работал,

dbDate = new java.sql.Date(dbDate.getTime());

Ответы [ 5 ]

4 голосов
/ 23 ноября 2011

Мне нужно удалить время из объекта Date

Ты не можешь. Объект java.util.Date содержит дату и время. toString() также имеет фиксированный формат . Если вы хотите представить его без времени для людей, то вам нужно преобразовать его в String, как вы уже сделали. Или, если вы намереваетесь сохранить его в БД без времени (как предполагает часть db в имени переменной dbDate), вам необходимо преобразовать его в java.sql.Date.

preparedStatement.setDate(1, new java.sql.Date(dbDate.getTime()));
// ...

Обновление Согласно вашему обновлению, ResultSet#getDate() возвращает экземпляр java.sql.Date, а не java.util.Date (но это подкласс java.util.Date, поэтому ненужное приведение сработало; пожалуйста обратите внимание, что приведение не совпадает с преобразованием, реальное преобразование будет new java.util.Date(dbDate.getTime())). Как вы можете прочитать в javadoc метода toString() java.sql.Date, он действительно в формате yyyy-MM-dd.

Итак, ваша конкретная проблема в том, что вы путаете java.sql.Date с java.util.Date и что вы неправильно понимаете внутреннюю работу java.util.Date и были введены в заблуждение методом toString(). Все работает как задумано.

Связанный:

1 голос
/ 23 ноября 2011

Если вы хотите удалить временную часть объекта Date:

Если вы хотите получить только представление String без временной части объекта Date:

  • Вы должны использовать SimpleDateFormat.format().Вы не можете заставить Date.toString() возвращать другое значение, он всегда будет использовать этот шаблон.Посмотрите на его исходный код .
0 голосов
/ 28 марта 2018

java.time

Ответ от BalusC правильный: вы не можете исключить время дня из объекта класса, определенного для хранения даты плюс время дня.

Кроме того, вы используете проблемные старые классы (java.util.Date и java.sql.Date), которые теперь устарели и заменены классами java.time .

Вместо этого используйте класс только для даты для значения только для даты.Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.java.sql.Date делает вид, что делает то же самое, но на самом деле имеет время суток из-за очень плохого проектного решения о наследовании от java.util.Date.Избегайте java.sql.Date и используйте вместо него java.time.LocalDate.

Вы, очевидно, начинаете с java.util.Date объекта.Это представляет точку на временной шкале в UTC с разрешением в миллисекундах.Поэтому для определения даты требуется часовой пояс.Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента.Если опущено, текущее значение по умолчанию JVM применяется неявно.Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Чтобы получить только датузначение из вашего java.util.Date, сначала преобразуйте в его java.time замена, Instant.Для преобразования туда и обратно вызовите новые методы, добавленные к старым классам.

Instant instant = myJavaUtilDate.toInstant() ;

Это значение в UTC по определению.Примените желаемый часовой пояс (ZoneId), чтобы создать ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z ) ;

Наконец, извлеките желаемый объект LocalDate из ZonedDateTime.

LocalDate ld = zdt.toLocalDate() ;

Начиная с JDBC 4.2 и более поздних версий, вы можете напрямую обмениваться классами java.time с вашей базой данных.Поэтому нет необходимости использовать классы java.sql, такие как java.sql.Date и java.sql.Timestamp.

myPreparedStatement.setObject( … , ld ) ;

Retrieval.

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

About 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?

  • Java SE 8 , Java SE 9 , а позже
    • Встроенный-в.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Многоефункции java.time перенесены в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android (<26) <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP проект адаптируется ThreeTen-Backport (упоминалось выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 24 февраля 2015

Я столкнулся с подобной проблемой для тех, кто сталкивается с той же проблемой, что и я. Я пишу эту запись:

Проблема заключается в значении даты, которое берется из базы данных и передается веб-клиенту в формате yyyy-mm-dd но в приложении для первой записи нет значения базы данных, поэтому мы создаем объект даты и передаем значение веб-клиенту, который дает нам значение метки времени.Значение, которое будет передано веб-клиенту, должно быть в формате даты, поэтому SimpleDateFormat не является хорошим выбором для меня. Из этого поста я понимаю разницу java.sql.date и java.util.date, а затем создаю первый объект как

Date date = new java.sql.Date(1430454600000L); 

, что дает yyyy-mm-dd значение для toString метода.

0 голосов
/ 23 ноября 2011

Когда вы в последний раз звоните formatter.parse(), вы получаете Date объект; затем конкатенация делает неявный вызов Date.toString(): формат, возвращаемый этим вызовом, является стандартным для локали, установленной в JVM. Вы должны понимать, что объект Date не имеет представления о строковом представлении, внутренне это просто совокупность целых

...