使用可变空格解析日期

时间:2011-05-04 06:42:14

标签: java date jodatime simpledateformat

我正在使用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的答案是一样的 - 我不使用它?)

3 个答案:

答案 0 :(得分:6)

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

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

希望有所帮助

答案 1 :(得分:4)

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

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

两种日期格式的顺序无关紧要。一旦我添加了两种格式,就不再输出警告。

答案 2 :(得分:2)

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)。

链接