Java 用变量空间解析日期

Java 用变量空间解析日期,java,date,jodatime,simpledateformat,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的答案相同吗?我没有

我使用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的答案相同吗?我没有使用它?

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

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

希望这有帮助

我尝试使用logstash 1.1.1中建议的单个“d”,但它仍然抱怨解析了一个带有额外前导空格的一位数的日期时,日期格式不正确。以下日志存储规则确实有效

timestamp => [ "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]
这两种日期格式的顺序并不重要。一旦我添加了两种格式,就不再输出警告。

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);
    }
输出:

To
DateTimeFormatter.ofPattern
格式化字母
p
表示在左侧填充空格
pp
表示填充到两个位置。它既可以用于格式化,也可以用于解析

我知道你问过乔达的时间。Joda Time主页上说:

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

链接
  • 解释如何使用java.time

非常感谢-SimpleDataFormat和JodaString=03-09-2015 06:45:00,s.replaceAll(“:(\\s+”,“:”)之间可能存在差异。非常感谢。我不知道
java.time
。将尝试转换
2006-11-20T14:40:36
2006-11-06T14:40:36