Java - SimpleDateFormat неожиданное поведение при разборе

1

Я читаю информацию из файла (.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);

Формат даты, который мне не нужен, показывает здесь, когда в прошлом этого вопроса так и не было. Наконец, информация отправляется в базу данных, где проблема сохраняется.

  • 1
    Разбор (строка в дату) не имеет ничего общего с форматированием (дата в строку).
Теги:
spring
date

5 ответов

2
Лучший ответ

Нет, это "становится" значением java.util.Date. Если вы затем преобразуете его обратно в строку, вызывая Date.toString(), вам следует проконсультироваться с документацией Date.toString() что ожидать.

Значение, хранящееся в Date является только точкой во времени - числом миллисекунд с эпохи Unix. Там нет формата, нет часового пояса и т.д. Он также не знает, что это была только дата, а не дата и время (присвоение Date является одним из многих неудачных аспектов API).

Очень важно, чтобы вы мысленно отделили "результат операции анализа" от "строкового значения, которое используется для представления этого результата, если я вызываю toString" ".

Я также советую вам установить часовой пояс на вашем SimpleDateFormat в UTC при анализе даты - таким образом вы знаете, что вы не можете иметь какие-либо двусмысленные или пропущенные времена, приводящие к тяжелому прогнозу поведения. (Конечно, вам тогда нужно знать, что вы проанализировали дату на "начало даты UTC" и соответствующим образом обработали ее в другом месте).

  • 0
    Я понимаю, что все по-другому, если мне нужно показать значение, проблема в том, что мне не нужно его показывать. request.setAttribute ("table", dateList) Последнее, что я делаю перед вставкой, которая также выполняет ту же проблему. В любом случае, я постараюсь установить UTC и посмотреть, что из этого выйдет.
  • 0
    @ lhuezo: Что вы подразумеваете под "который также выполняет ту же проблему"? Вы не описали, в чем проблема на самом деле - и мы понятия не имеем, что request здесь. Если вас интересует конкретное строковое представление, вам необходимо соответствующим образом отформатировать значение Date .
Показать ещё 10 комментариев
0

Анализ не означает его формат, он просто анализирует его как текст для объекта java.util.Date. См. Метод анализа в документации.

Вам нужно использовать метод format.

dateFormat.format(travel.getDate())

Дополнительную информацию см. В документации.

  • 0
    Это значит, что мне нужно вернуться к строке и затем вернуться к объекту Date?
  • 0
    @lhuezo Нет, вы можете напрямую пропустить шаг разбора и отформатировать напрямую travel.getDate ()
0

Как я понимаю, метод 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. Надеюсь, это поможет вам.

0

Вы также должны использовать форматтер при печати Date.

dateFormat.format( travel.getDate() );

Когда ваш синтаксический анализ String использует DateFormat, вы получаете полный объект Date с отсутствующими единицами времени в строке, инициализированной нулем. В вашем примере это часы, минуты и секунды.

По умолчанию, если вы не используете форматировщик, выводится строковое представление Date умолчанию (предоставляемое его методом toString()).

0

если 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));
  • 0
    Проблема в том, что мне не нужно показывать значение, мне нужно вставить его в базу данных в указанном формате. Я нахожу странным, что после разбора String to Date мне нужно установить его обратно в String.
  • 0
    Затем вставьте это, кто мешает вам сделать это .... см. Мой отредактированный раздел

Ещё вопросы

Сообщество Overcoder
Наверх
Меню