【发布时间】:2018-02-08 06:27:45
【问题描述】:
我们希望从不同系统、不同语言和日志机制的日志文件中得到正确的日期格式。
我们认为这可以通过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 进行格式化。
前一个说得还差得很远。
那么,有没有办法从多个日期格式中确定正确的日期格式?
【问题讨论】:
-
那么,您是否希望保留毫秒精度信息?仅仅因为两种模式都有效并不能告诉我们您要使用哪一种。顺便说一句,考虑使用 Java 8 日期/时间 API,这会使事情变得更容易。
-
@TimBiegeleisen 我认为很容易发现前者不正确
yyyy应该只是0018兼容而不是18兼容?但 SimpleDateFormat 不这么认为? -
@rufushuang 您可以在解析之前优先考虑格式。这次不包含时区信息,这不是一个好习惯
-
两条信息:(1)永远不要使用
SimpleDateFormat,它已经过时并且出了名的麻烦。java.time使用起来更好。 (2) 我相信java.time.format.DateTimeFormatter默认设置会这样解决你的问题。 -
@OleV.V.我应该是sdf2,但是结果和问题还是一样的。 DateTimeFormatter 在上面提供的情况下工作得很好,我会给它更多的机会来测试它是否可以生存:)
标签: java datetime simpledateformat date-format datetime-format