Как распарсить строку в LocalDateTime, если в строке не фиксированное количество цифр?
Есть задача парсить строку-дату в объект типа LocalDateTime. Проблема в том, что строка может содержать от 1 до 9 цифр (миллисекунд) после точки. А может и не содержать миллисекунд, тогда точки в конце вообще не будет. Как правильно парсить в таком случае?
В данный момент была попытка это сделать так:
String datePattern = "yyyy-MM-dd'T'HH:mm:ss[.SSSSSSSSS][.SSSSSS][.SSS]";
LocalDateTime dt = LocalDateTime.parse(dateString, DateTimeFormatter.ofPattern(datePattern));
Естественно, этот паттерн не захватывает все случаи, т.к. есть сомнения, что так делать в принципе правильно.
Так же пробовал паттерн "yyyy-MM-dd'T'HH:mm:ss[.[S][S][S][S][S][S][S][S][S]]", но с ним в результате парса получается не та дата, которая в строке (думаю, из-за того, что одни [] внутри других не поддерживаются).
Код для проверки:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
public class Main {
public static void main(String[] args) {
String datePattern = "yyyy-MM-dd'T'HH:mm:ss[.SSSSSSSSS][.SSSSSS][.SSS]";
String dt_template = "2021-02-19T03:53:12%s";
for (int i = 0; i < 10; ++i) {
StringBuilder stringBuilder = new StringBuilder();
if (i > 0) {
stringBuilder.append('.');
}
for (int digits_count = 0; digits_count < i; ++digits_count) {
stringBuilder.append('3');
}
String dateString = String.format(dt_template, stringBuilder.toString());
try {
LocalDateTime dt = LocalDateTime.parse(dateString, DateTimeFormatter.ofPattern(datePattern));
System.out.println(dt);
} catch (DateTimeParseException e) {
System.out.println(e.getMessage());
}
}
}
}
Ответы (1 шт):
В лоб ты эту проблему скорее всего не решишь. Тут надо динамически формировать шаблон после оценки количества знаков для частей секунды. Иными словами, сначала оценить сколько знаков после точки, а потом сделать парсинг. Это будет выглядеть примерно так:
@Test
void test() {
String f = "yyyy-MM-dd'T'HH:mm:ss";
String t = "2021-02-19T03:53:12";
String[] dtArr = new String[]{t, t + ".1", t + ".1234", t + ".123456789"};
for (String dt : dtArr) {
int ind = dt.indexOf(".");
StringBuilder end = new StringBuilder();
if (ind > -1) {
end.append('.');
int cnt = dt.length() - (ind + 1);
char[] chars = new char[cnt];
Arrays.fill(chars, 'S');
end.append(chars);
}
String pat = f + end.toString();
LocalDateTime ldt1 = LocalDateTime.parse(dt, DateTimeFormatter.ofPattern(pat));
System.out.println("nano = " + ldt1.getNano());
}
}