【问题标题】:Java determine one dateformat from several dateformatsJava 从几种日期格式中确定一种日期格式
【发布时间】:2018-02-08 06:27:45
【问题描述】:

我们希望从不同系统、不同语言和日志机制的日志文件中得到正确的日期格式。

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

前一个说得还差得很远。

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

【问题讨论】:

  • 那么,您是否希望保留毫秒精度信息?仅仅因为两种模式都有效并不能告诉我们您要使用哪一种。顺便说一句,考虑使用 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


【解决方案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

【讨论】:

  • 通过 jdk6 和 joda-time 上的所有测试用例。考虑到我的项目对 jdk6 的支持,所以使用joda-time 而不是java.time.formatjoda-time 没有 STRICT 样式配置?
  • (1) Joda-Time 是一个基本完成的项目;在 Java 6 上,我显然更喜欢 the ThreeTen Backport 而不是 Joda。 (2) 我不知道 Joda-Time,对不起,所以不能说。如果不区分宽松和严格,可能是因为它总是严格的?
【解决方案2】:

检查下面的代码 sn-p。您可以列出具有优先级的数据格式。在它找到一个合适的之后,除非继续,否则它将中断。

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

        }


    }

【讨论】:

  • 感谢您的想法,但是当日期格式种类繁多时,选择优先级仍然相当困难。
  • 据我所知,在记录时它包含时区信息。您可以按具有更多时间数据的模式对其进行优先级排序。如果数据相同,那么它们的优先级没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多