11

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

 Mon Nov 20 14:40:36 2006
 Mon Nov  6 14:40:36 2006

请注意,dayOfMonth 字段左侧填充空白。

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

"EEE MMM dd HH:mm:ss yyyy"
"EEE MMM  d HH:mm:ss yyyy"

是否有处理这两种情况的单一格式(或 API 切换)?(对于 SimpleDateFormat 的答案是否相同 - 我不使用它?)

4

3 回答 3

8

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

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

输出是 -

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

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

EEE MMM d HH:mm:ss yyyy

希望有帮助

于 2011-05-04T08:52:07.863 回答
7

java.time 和格式模式字母 p

这是现代答案,使用的是 Joda-Time 的继承者 java.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);
    }

输出:

2006-11-20T14:40:36
2006-11-06T14:40:36

DateTimeFormatter.ofPattern格式化字母意味着在p左边用空格填充。pp表示填充到两个位置。它可以用于格式化和 - 如此处 - 解析。

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

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

链接

于 2019-09-05T13:14:01.357 回答
5

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

timestamp => [ "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]

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

于 2012-09-04T22:28:14.257 回答