Java 从多种日期格式中确定一种日期格式

Java determine one dateformat from several dateformats

我们希望从具有不同语言和日志机制的不同系统生成的日志文件中获取正确的日期格式。

我们认为这可以通过 SimpleDataFormat.parsetry-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:ssyy-MM-dd HH:mm:ss:SSS 格式化。

前者远远正确。

那么,有没有办法从多种日期格式中确定正确的日期格式?

检查下面的代码片段。您可以优先列出您的数据格式。找到一个合适的后,除非继续,否则它将中断。

对于

 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();
            }

        }


    }

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)。它可能会捕获更多不匹配的字符串。在这种情况下,您将需要 uuuuuu 而不是格式模式中的 yyyyyy