Пользовательский формат даты не может быть проанализирован. (Джава) - PullRequest
9 голосов
/ 25 января 2010

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

Есть ли простой обходной путь или я должен обрабатывать микросекунды самостоятельно (с помощью функций String)?

@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: не разбираемая дата: "2010-01-25-12.40.35.769000"

Ответы [ 4 ]

12 голосов
/ 25 января 2010

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

2010-01-25-14.17.47.307000

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

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

3 голосов
/ 25 января 2010

Помимо ответа jarnbjo, если вам нужны микросекунды, вы можете использовать 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));
1 голос
/ 29 мая 2017

ТЛ; др

LocalDateTime.parse( 
    "2010-01-25-12.40.35.769000" ,
    DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" ) 
)

Использование java.time

Вы используете проблемные старые классы даты и времени, которые теперь унаследованы, заменены классами java.time.

Эти старые классы были ограничены отслеживанием миллисекунд , тремя цифрами десятичной дроби. Современные классы java.time разрешают до наносекунд , для девяти цифр десятичной дроби.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" ) ;
LocalDateTime ldt = LocalDateTime.parse( "2010-01-25-12.40.35.769000" );

ldt.toString (): 2010-01-25T12: 40: 35,769

ISO 8601

Совет. Вместо того, чтобы придумывать собственный формат для текстового представления значения даты и времени, придерживайтесь стандартных форматов ISO 8601 .

Классы java.time по умолчанию используют стандартные форматы. Вы можете увидеть этот формат в выводе выше. T отделяет часть даты от части времени суток.


О java.time

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

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

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

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

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

0 голосов
/ 25 января 2010

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

Форматы даты и времени указаны строки шаблона даты и времени. В строки шаблона даты и времени, буквы без кавычек от 'A' до 'Z' и от «а» до «z» интерпретируются как буквы образца, представляющие компоненты строки даты или времени. Текст может быть заключен в одинарные кавычки ('), чтобы избежать интерпретации. «„“» представляет одну цитату. Все остальные символы не интерпретируются; они просто копируются в вывод строка во время форматирования или сопоставления против входной строки во время разборе.

...