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