有一项任务是将字符串日期解析为 类型的对象LocalDateTime。问题是字符串可以在点之后包含 1 到 9 个数字(毫秒)。或者它可能不包含毫秒,那么最后将没有任何意义。在这种情况下如何正确解析?
目前有人试图这样做:
String datePattern = "yyyy-MM-dd'T'HH:mm:ss[.SSSSSSSSS][.SSSSSS][.SSS]";
LocalDateTime dt = LocalDateTime.parse(dateString, DateTimeFormatter.ofPattern(datePattern));
自然,这种模式并不能捕获所有情况,因为 有人怀疑这样做原则上是否正确。
我也尝试了 pattern "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());
}
}
}
}
在额头上,你很可能不会解决这个问题。这里有必要在估计几分之一秒的字符数后动态生成一个模板。也就是说,先估计点后面有多少个字符,然后进行解析。它看起来像这样: