Позволяет ли Java DateTimeFormatter щадящий анализ в течение долей секунды? ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Позволяет ли Java DateTimeFormatter щадящий анализ в течение долей секунды?

Сообщение Anonymous »

В настоящее время я работаю с Java DateTimeFormatter для анализа меток времени в формате ISO 8601, особенно тех, которые содержат доли секунды. Экспериментируя с различными форматами временных меток, я заметил неожиданное поведение относительно того, как форматтер обрабатывает необязательные дробные секунды.
В частности, меня интересует снисходительность синтаксического анализатора, когда дело доходит до количества цифры в долях секунды. Моя реализация позволяет использовать временные метки с 9 цифрами в течение долей секунды, однако анализатор успешно обрабатывает временные метки только с 8 цифрами и не справляется с метками с 7 или меньше. Это заставило меня задаться вопросом, есть ли основная причина такого поведения, является ли оно частью конструкции DateTimeFormatter и документировано ли оно где-либо.
Я написал тест, используя следующий код:

Код: Выделить всё

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class DateTimeExample {
public static void main(String[] args) {
String[] timestamps = {
"2023-10-05T15:14:29.123456789Z", // 9 digits
"2023-10-05T15:14:29.12345678Z",  // 8 digits
"2023-10-05T15:14:29.1234567Z",   // 7 digits
"2023-10-05T15:14:29.123456Z",    // 6 digits
"2023-10-05T15:14:29.12345Z",     // 5 digits
"2023-10-05T15:14:29.1234Z",      // 4 digits
"2023-10-05T15:14:29.123Z",       // 3 digits
"2023-10-05T15:14:29.12Z",        // 2 digits
"2023-10-05T15:14:29.1Z",         // 1 digit
"2023-10-05T15:14:29Z"             // no fractional seconds
};

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSSSSSSSS]'Z'");

for (String timestamp : timestamps) {
try {
LocalDateTime dateTime = LocalDateTime.parse(timestamp, formatter);
System.out.println("Parsed date: " + dateTime);
} catch (DateTimeParseException e) {
System.err.println("Failed to parse: " + timestamp + " - " + e.getMessage());
}
}
}
}
Наблюдения
Когда я запускаю этот код, вот результат:
< pre class="lang-none Prettyprint-override">

Код: Выделить всё

Parsed date: 2023-10-05T15:14:29.123456789
Parsed date: 2023-10-05T15:14:29.123456780
Failed to parse: 2023-10-05T15:14:29.1234567Z - Text '2023-10-05T15:14:29.1234567Z' could not be parsed at index 19
Failed to parse: 2023-10-05T15:14:29.123456Z - Text '2023-10-05T15:14:29.123456Z' could not be parsed at index 19
Failed to parse: 2023-10-05T15:14:29.12345Z - Text '2023-10-05T15:14:29.12345Z' could not be parsed at index 19
Failed to parse: 2023-10-05T15:14:29.1234Z - Text '2023-10-05T15:14:29.1234Z' could not be parsed at index 19
Failed to parse: 2023-10-05T15:14:29.123Z - Text '2023-10-05T15:14:29.123Z' could not be parsed at index 19
Failed to parse: 2023-10-05T15:14:29.12Z - Text '2023-10-05T15:14:29.12Z' could not be parsed at index 19
Failed to parse: 2023-10-05T15:14:29.1Z - Text '2023-10-05T15:14:29.1Z' could not be parsed at index 19
Parsed date: 2023-10-05T15:14:29
Он успешно анализирует метки времени с 9 цифрами для дробных секунд или без дробной части, что является ожидаемым поведением. Но почему он также работает с 8 цифрами для дробной части?
Мой вывод из этого поведения заключается в том, что DateTimeFormatter снисходителен к использованию в шаблоне до одной дополнительной цифры. Правильно ли это, и если да, то есть ли какая-либо соответствующая документация, на которую я могу сослаться?

Подробнее здесь: https://stackoverflow.com/questions/790 ... al-seconds

Вернуться в «JAVA»