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

时间:2018-02-08 06:27:46

标签: java datetime simpledateformat date-format datetime-format

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

我们认为这可以通过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格式化。

前者远非正确。

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

2 个答案:

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

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

        }


    }