java.text.ParseException: не разбираемая дата: гггг-мм-дд чч: мм: сс.сссссс - PullRequest
6 голосов
/ 22 декабря 2011

Я получаю ParseException для следующего кода

    String dateStr = "2011-12-22 10:56:24.389362";
    String formatStr = "yyyy-MM-dd HH:mm:ss.SSSSSS";
    Date testDate = null;
    SimpleDateFormat sdf= new SimpleDateFormat(formatStr);
    sdf.setLenient(false);
    testDate = sdf.parse(dateStr);

    System.out.println("CHECK DATE " + sdf.format(testDate));

Exception in thread "main" java.text.ParseException: Unparseable date: "2011-12-22 10:56:24.389362" at java.text.DateFormat.parse(DateFormat.java:337)

Если я закомментирую строку sdf.setLenient(false), то я вижу разницу во времени в выводеCHECK DATE 2011-12-22 11:02:53.000362

Что я делаю не так ??

Ответы [ 5 ]

7 голосов
/ 22 декабря 2011

'S' для миллисекунды.В секунду 1000 (от 0 до 999) миллисекунд.389362 больше, чем 999. Дополнительные 389000 миллисекунд преобразуются в 389 секунд или 6 минут 29 секунд и добавляются к времени.

4 голосов
/ 22 декабря 2011

Спецификатор формата S относится к миллисекундам.Когда вы разрешаете мягкий анализ, последняя часть интерпретируется как 389362 миллисекунды.Когда это добавлено к дате, последние 3 цифры (на самом деле, значение% 1000) становятся фактическими миллисекундами, и вы получите дату примерно на 389 секунд (~ 6 1/2 минут) позже, чем вы ожидаете,(При строгом анализе синтаксический анализатор знает, что 389362 миллисекунды не имеет смысла, поэтому он выдает ошибку.)

Самый простой способ, если вы можете гарантировать, что дата всегда будет выглядеть так, будетотрубить последние 3 цифры.(Это примерно половина времени даст вам дату, которая отключается на миллисекунду. Но это лучше, чем писать анализатор даты ...)

3 голосов
/ 22 декабря 2011

Ваш ввод даты в миллисекундах неверен.Это должно быть: -

String dateStr = "2011-12-22 10:56:24.389";

Вам также не нужно дополнительное количество "S" в шаблоне.Следующего должно быть достаточно:

String formatStr = "yyyy-MM-dd HH:mm:ss.S";

Это явно упоминается в документах java для типа представления Number:

Число: для форматирования количество букв шаблона - это минимальное количество цифр, а более короткие числа дополняются нулями до этой суммы.Для разбора количество букв шаблона игнорируется , если только это не необходимо для разделения двух смежных полей.

Это работает, когда вы задаете значение lenient равным true (или комментируетепо умолчанию это правда), так как вы просите синтаксический анализатор не быть строгим в разборе.Из документов Java на setLenient () : -

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

2 голосов
/ 22 декабря 2011

S используется только в течение миллисекунд . Если вы хотите микросекунды, вам придется написать свой собственный парсер.

0 голосов
/ 10 февраля 2012

Используйте toISOString('HH:mm:ss.S'), чтобы получить миллисекунды (3 цифры), затем заполните, как вам нужно, 0. 0. 1002 *

Например:

new Date().toISOString('HH:mm:ss.S')

возвращает "2012-02-10T12: 16: 39.124Z"

...