我们希望从具有不同语言和日志机制的不同系统生成的LOG文件中获取正确的日期格式。
我们认为这可以通过SimpleDataFormat.parse
和try-catch exception
方式完成。但是以下代码显示了一个问题。
String tryparseString = "18-01-22 00:03:34:071";
try {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf1.parse(tryparseString));
System.out.println(sdf1.format(sdf1.parse(tryparseString)));
System.out.println("Yeah! We found a CAN PARSE datefromat = " + sdf1.toPattern());
SimpleDateFormat sdf2 = new SimpleDateFormat("yy-MM-dd HH:mm:ss:SSS");
System.out.println(sdf2.parse(tryparseString));
System.out.println(sdf2.format(sdf2.parse(tryparseString)));
System.out.println("Yeah! We found a CAN PARSE datefromat = " + sdf2.toPattern());
} catch (ParseException e) {
e.printStackTrace();
}
这得到了一个结果:
Sat Jan 22 00:03:34 CST 18
0018-01-22 00:03:34
Yeah! We found a CAN PARSE datefromat = yyyy-MM-dd HH:mm:ss
Mon Jan 22 00:03:34 CST 2018
18-01-22 00:03:34:000
Yeah! We found a CAN PARSE datefromat = yy-MM-dd HH:mm:ss:SSS
因此,"18-01-22 00:03:34:071"
可以使用yyyy-MM-dd HH:mm:ss
和yy-MM-dd HH:mm:ss:SSS
格式化。
前者远非正确。
那么,有没有办法从几个日期格式中确定正确的日期格式?
答案 0 :(得分:1)
java.time
救援。
String[] formats = {
"yyyy-MM-dd HH:mm:ss",
"yy-MM-dd HH:mm:ss:SSS"
};
String tryparseString = "18-01-22 00:03:34:071";
for (String format : formats) {
try {
LocalDateTime.parse(tryparseString, DateTimeFormatter.ofPattern(format));
System.out.println("Yeah! We found a CAN PARSE date format = " + format);
} catch (DateTimeParseException dtpe) {
System.out.println(dtpe);
}
}
打印:
java.time.format.DateTimeParseException: Text '18-01-22 00:03:34:071' could not be parsed at index 0
Yeah! We found a CAN PARSE datefromat = yy-MM-dd HH:mm:ss:SSS
换句话说,第一种格式yyyy-MM-dd HH:mm:ss
无法解析您的示例字符串,第二种格式会按您的要求成功。
如果您仍遇到DateTimeFormatter
解析字符串不应该的情况,您可以尝试DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.STRICT)
。它可能会捕获一些不匹配的字符串。在这种情况下,您需要uuuu
和uu
而不是格式模式中的yyyy
和yy
。
答案 1 :(得分:0)
请查看以下代码段。您可以拥有优先级的数据格式列表。在找到一个合适的它之后它会破裂,除非继续。
代表
String tryparseString = "18-01-22 00:03:34:071";
public void parseDate(String tryparseString) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yy-MM-dd HH:mm:ss:SSS");
ArrayList<SimpleDateFormat> simpleDateFormats = new ArrayList<>();
simpleDateFormats.add(sdf1);//add as your priority
simpleDateFormats.add(sdf2);
for (int a = 0; a < simpleDateFormats.size(); a++) {
SimpleDateFormat simpleDateFormat = simpleDateFormats.get(a);
try {
System.out.println(simpleDateFormat.parse(tryparseString));
System.out.println(simpleDateFormat.format(simpleDateFormat.parse(tryparseString)));
System.out.println("Yeah! We found a CAN PARSE datefromat = " + sdf1.toPattern());
break;//When Meets it will breack the parsing
} catch (ParseException e) {
e.printStackTrace();
}
}
}