Я читаю информацию из файла (.csv), который будет вставлен в базу данных после проверки и утверждения конечного пользователя. Текстовый файл считывается, проверяется и его информация загружается в список, содержащий формы, которые используются для проверки наличия данных в базе данных.
Проблема возникает при анализе строки по дате. Метод SimpleDateFormat.parse() возвращает неожиданный формат даты, даже если шаблон для SimpleDateFormat равен "yyyy-MM-dd".
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Разбор загруженных значений на объект перемещения:
travel.setDate( dateFormat.parse( form.getTravelDate() ));
В отладчике форма показывает дату как:
"2012-12-12"
Он читается так, как предполагалось. Однако при анализе становится:
Wed Dec 12 00:00:00 CST 2012
Я потратил целый день, пытаясь решить это, но на этот раз у меня нет идей. Afaik шаблон в порядке, и я попытался добавить локаль безрезультатно.
Изменение: проблема в том, когда мне нужно вставить значения в базу данных с помощью Hibernate. Нежелательный формат также заканчивается в базе данных.
Данные отображаются на странице.jsp, используя
HttpServletRequest("table",travelList);
Формат даты, который мне не нужен, показывает здесь, когда в прошлом этого вопроса так и не было. Наконец, информация отправляется в базу данных, где проблема сохраняется.
Нет, это "становится" значением java.util.Date
. Если вы затем преобразуете его обратно в строку, вызывая Date.toString()
, вам следует проконсультироваться с документацией Date.toString()
что ожидать.
Значение, хранящееся в Date
является только точкой во времени - числом миллисекунд с эпохи Unix. Там нет формата, нет часового пояса и т.д. Он также не знает, что это была только дата, а не дата и время (присвоение Date
является одним из многих неудачных аспектов API).
Очень важно, чтобы вы мысленно отделили "результат операции анализа" от "строкового значения, которое используется для представления этого результата, если я вызываю toString"
".
Я также советую вам установить часовой пояс на вашем SimpleDateFormat
в UTC при анализе даты - таким образом вы знаете, что вы не можете иметь какие-либо двусмысленные или пропущенные времена, приводящие к тяжелому прогнозу поведения. (Конечно, вам тогда нужно знать, что вы проанализировали дату на "начало даты UTC" и соответствующим образом обработали ее в другом месте).
request
здесь. Если вас интересует конкретное строковое представление, вам необходимо соответствующим образом отформатировать значение Date
.
Анализ не означает его формат, он просто анализирует его как текст для объекта java.util.Date
. См. Метод анализа в документации.
Вам нужно использовать метод format
.
dateFormat.format(travel.getDate())
Дополнительную информацию см. В документации.
Как я понимаю, метод parse
возвращает Date
. Ниже приведен синтаксис метода синтаксического анализа.
public Date parse(String source)
throws ParseException
Итак, вам нужно проанализировать дату строки и сохранить в переменной Date. Затем отформатируйте переменную Date с помощью SimpleDateFormat
.
//getTravelDate is "2012-12-12"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date dtObj=new Date();
dtObj=dateFormat.parse(form.getTravelDate()); //Store in date variable
System.out.println(dateFormat.format(dtObj)); // Now format the date object
Конечным результатом будет 2012-12-12
. Надеюсь, это поможет вам.
Вы также должны использовать форматтер при печати Date
.
dateFormat.format( travel.getDate() );
Когда ваш синтаксический анализ String
использует DateFormat
, вы получаете полный объект Date
с отсутствующими единицами времени в строке, инициализированной нулем. В вашем примере это часы, минуты и секунды.
По умолчанию, если вы не используете форматировщик, выводится строковое представление Date
умолчанию (предоставляемое его методом toString()
).
если form.getTravelDate()
возвращает String, то сначала Parse
дату из строки
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
Date parsedDate=dateFormat.parse(form.getTravelDate());
// Here parsedDate is in form Wed Dec 12 00:00:00 CST 2012
Теперь отформатируйте дату, используя тот же SImpleDateFormat, чтобы получить желаемый результат
System.out.println(dateFormat.format(parsedDate));
Ваш желаемый результат
2012-12-12
Обновить
Предполагая данные Тип столбцов, в которые мы вставляем эти данные в базу данных, относится к типу Date
не varchar
то используйте приведенный ниже оператор
travel.setDate(dateFormat.format(parsedDate));