Пользовательский формат даты не может быть проанализирован. (Java)

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

Существует ли простое обходное решение, или я должен обработать микросекунды самостоятельно (со Строковыми функциями)?

@Test
public void testDateFormat() throws ParseException {
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000");
    String theDate = format.format(new Date());
    // this will fail:
    format.parse(theDate);
}

java.text. ParseException: дата Unparseable: "2010-01-25-12.40.35.769000"

9
задан Christian Strempfer 17 October 2014 в 13:01
поделиться

3 ответа

Ваша проблема в том, что шаблон, используемый в SimpleDateFormat, к сожалению, имеет различные значения в зависимости от того, используется ли он как парсер или как форматер. Как форматер, шаблон делает то, что ожидается, выводится значение миллисекунды, отформатированное как три цифры, за которыми следуют три 0 символа, например:

2010-01-25-14.17.47.307000

Использованный как парсер, шаблон "SSS" будет, тем не менее, соответствовать произвольному количеству цифр и разобрать приведенный выше пример на 307000 мс. После разбора поля ms, парсер все равно будет искать подстроку "000" и провалится с исключением, так как вы дошли до конца входной строки, не выполнив требований шаблона.

Поскольку в SimpleDateFormat нет шаблона для значения µs, вам придется записать свою собственную обертку, чтобы зачистить входную строку для последних трех 0 символов, прежде чем подавать ее в SimpleDateFormat.

12
ответ дан 4 December 2019 в 13:01
поделиться

В дополнение к ответу Джарнбжо, если вам нужны микросекунда, вы можете использовать Java.sql.timestamp:

Date dateToMillis = format.parse(theDate.substring(0, 23));
DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Timestamp timestamp = Timestamp.valueOf(timestampFormat.format(dateToMillis) + theDate.substring(23,26));
3
ответ дан 4 December 2019 в 13:01
поделиться

Добавьте '' вокруг нулей, вот так: "yyyy-MM-dd-HH.mm.ss.SSS'000'"

Форматы даты и времени задаются следующими параметрами строки даты и времени. В пределах строки даты и времени, нецитируемые буквы от "А" до "З" и от 'a' до 'z' интерпретируются как шаблонные письма, изображающие компоненты строки даты или времени. Текст может быть процитирован с использованием одинарных котировок (') чтобы избежать интерпретации. "''" представляет собой единственную цитату. Все остальные символы не интерпретируются; они просто копируются в выходные данные строка во время форматирования или подбора против входной строки во время Разбор.

0
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: