Как правильно отформатировать дату в гггг-мм-дд? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть столбец в моей таблице типа Дата в MYSQL, и вставка формата даты 25-March-2019 hh:mm:ss возвращает ошибку, сообщающую мне неверное значение данных.

Итак, мой код написан так:

 String startdt=request.getParameter("startdate");
    String enddate=request.getParameter("enddate");
    SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
    Date Startdate=dateFormat.parse(startdt);
    Date Enddate=dateFormat.parse(enddate);

И я передаю Startdate и Enddate функции, которая вставляется в столбец моей таблицы.

Есть ли способ, которым у меня могут быть Startdate и Enddate, указанные выше, просто вернуться в yyyy-mm-dd без времени, чтобы я мог вставить в свою базу данных без ошибок?

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

ТЛ; др

myPreparedStatement
.setObject(
    LocalDate.parse( "2019-01-23" ) 
) ;

DATE в MySQL только на дату

Тип DATE в MySQL является значением только для даты, без времени суток и без часового пояса.

Выдержка из Документация по MySQL 8.0 :

Тип DATE используется для значений с частью даты, но без части времени. MySQL извлекает и отображает значения DATE в формате «ГГГГ-ММ-ДД». Поддерживаемый диапазон: от «1000-01-01» до «9999-12-31».

Используйте тип «только дата» в Java для данных, поступающих из типа «только дата» в вашей базе данных. Класс java.util.Date, который вы пытаетесь использовать, это , а не дата, это момент в UTC, дата с временем суток и смещением от UTC, равным нулю, все отслеживаются как счетчик миллисекунд с первого момента 1970 года в UTC. Неправильное название этого класса является лишь первым из многих неудачных вариантов дизайна, сделанных этими программистами. Вместо этого перейдите к java.time классам. Прекратить использование Date.

MM = номер месяца, а не название

Ваш формат "yyyy-MM-dd" предназначен для числового месяца, а не строки названия месяца, показанной в вашем примере значения 25-March-2019.

Избегайте устаревших классов даты и времени

Классы SimpleDateFormat и Date ужасны, ужасный беспорядок плохого дизайна. Они были вытеснены несколько лет назад с принятием JSR 310, реализованного в классах java.time .

Умные объекты, а не тупые нити

Обменивайтесь объектами с вашей базой данных, где это возможно, а не с текстом.

Начиная с JDBC 4.2, мы можем напрямую обмениваться java.time объектами с базой данных. В качестве значения только для даты, например, для типа DATE стандарта SQL, используйте класс java.time.LocalDate.

Видимо, ваши текстовые вводы для значений даты имеют формат ГГГГ-ММ-ДД, который является стандартным ISO 8601 форматом. Классы java.time по умолчанию используют форматы ISO 8601. Поэтому нет необходимости указывать шаблон форматирования.

LocalDate localDate = LocalDate.parse( "2019-01-23" ) ;
myPreparedStatement.setObject( … , localDate ) ;

индексирование.

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

localDate.toString (): 2019-01-23

Если вы хотите создать строку, представляющую значение этого объекта LocalDate в другом текстовом формате, используйте класс DateTimeFormatter. Поищите переполнение стека для получения дополнительной информации, так как он, как и остальная часть вашего вопроса, уже много раз освещался в переполнении стека. Выполните поиск переполнения стека перед публикацией.

Совет. Обычно лучше использовать PreparedStatement в своей работе JDBC . Одним из основных преимуществ является предотвращение SQL-инъекций атак безопасности.


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

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

2 голосов
/ 26 марта 2019

Java 7 и ThreeTen Backport

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("d-MMMM-uuuu HH:mm:ss", Locale.ENGLISH);
    String dateFromHtmlForm = "25-March-2019 22:43:55";
    LocalDateTime dateTime = LocalDateTime.parse(dateFromHtmlForm, formatter);
    // We are discarding the time of day and only saving the date
    java.sql.Date dateToSave = DateTimeUtils.toSqlDate(dateTime.toLocalDate());

    String insertSql = "insert into your_table (your_date_column) values (?);";
    try (PreparedStatement insertStatement
            = yourDatabaseConnection.prepareStatement(insertSql)) {
        insertStatement.setDate(1, dateToSave);
        int rowsInserted = insertStatement.executeUpdate();
    }

Как уже было сказано, передайте объекты даты MySQL, а не строки. В Java 8 и более поздних версиях это были бы LocalDate объекты, но в Java 7 нам нужно обойтись с плохо спроектированным классом java.sql.Date. Это все еще лучше чем последовательности. И преобразование из LocalDate просто.

В Java 7 мы можем использовать java.time через backport, ThreeTen Backport (ThreeTen для JSR-310). Мой импорт:

import org.threeten.bp.DateTimeUtils;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.format.DateTimeFormatter;

Почему мы хотим использовать для этого внешнюю библиотеку? Есть плюсы и минусы, конечно. Преимущества включают в себя:

  • java.time намного приятнее в работе, чем старые 101-х * и SimpleDateFormat, и дает более четкий код.
  • Он ориентирован на будущее: после перехода на Java 8 или более позднюю версию все, что вам нужно сделать, - это изменить операторы импорта (и отбросить библиотеку, и повторно протестировать).

Ссылки

...