使用可变空格解析日期

pet*_*ust 7 java date jodatime simpledateformat

我正在使用Joda来解析日期并使用不使用前导零的格式,例如:

 Mon Nov 20 14:40:36 2006
 Mon Nov  6 14:40:36 2006
Run Code Online (Sandbox Code Playgroud)

请注意,dayOfMonth字段用空白填充.

目前我似乎必须使用两种不同的格式,如果一个失败则重新分析

"EEE MMM dd HH:mm:ss yyyy"
"EEE MMM  d HH:mm:ss yyyy"
Run Code Online (Sandbox Code Playgroud)

是否有单一格式(或API开关)处理这两种情况?(SimpleDateFormat的答案是一样的 - 我不使用它?)

小智 7

我刚刚创建了一个快速程序来检查这个 -

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy");

try {
    String source1 = "Mon Nov 20 14:40:36 2006";
    Date d1 = sdf.parse(source1);
    String source2 = "Mon Nov  6 14:40:36 2006";
    Date d2 = sdf.parse(source2);

    String res1 = sdf.format(d1);
    String res2 = sdf.format(d2);

    System.out.println(source1 +"="+ res1);
    System.out.println(source2 +"="+ res2);
} catch (ParseException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这个输出是 -

Mon Nov 20 14:40:36 2006=Mon Nov 20 14:40:36 2006
Mon Nov  6 14:40:36 2006=Mon Nov 6 14:40:36 2006
Run Code Online (Sandbox Code Playgroud)

所以,即使source2有额外的空间,它仍然被解析

EEE MMM d HH:mm:ss yyyy
Run Code Online (Sandbox Code Playgroud)

希望有所帮助


Ole*_*.V. 6

java.time 和格式模式字母 p

这是现代答案,使用 java.time,Joda-Time 的继承者。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM ppd HH:mm:ss uuuu", Locale.ENGLISH);

    String[] stringsToParse = {
            "Mon Nov 20 14:40:36 2006",
            "Mon Nov  6 14:40:36 2006"
    };
    for (String dateTimeString : stringsToParse) {
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
        System.out.println(dateTime);
    }
Run Code Online (Sandbox Code Playgroud)

输出:

2006-11-20T14:40:36
2006-11-06T14:40:36
Run Code Online (Sandbox Code Playgroud)

为了DateTimeFormatter.ofPattern格式信p方式填充在左侧的空间。pp表示填充到两个位置。它可以用于格式化和 - 就像这里 - 解析。

我知道你问过 Joda-Time。Joda-Time 主页说:

请注意,Joda-Time 被认为是一个很大程度上“已完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到java.time(JSR-310)。

链接


小智 5

我尝试使用上面在logstash 1.1.1中建议的单个“d”,但是当解析带有额外前导空格的单个数字日期时,它仍然抱怨日期格式错误。以下 logstash 规则确实有效。

timestamp => [ "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]
Run Code Online (Sandbox Code Playgroud)

两种日期格式的顺序无关紧要。添加两种格式后不再输出警告。