我正在尝试从 IPTC 元数据中解析垃圾日期值。格式应该为yyyyMMdd
,但在某些情况下并非如此。我发现的一个特定值是“Tue Jan 05 00:00:00 AEDT 2016”
。
如果我尝试使用 Joda 的 DateTimeFormatter
解析它:
DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z yyyy")
.parseLocalDate("Tue Jan 05 00:00:00 AEDT 2016");
这给了我一个错误:
java.lang.IllegalArgumentException: Invalid format: "Tue Jan 05 00:00:00 AEDT 2016" is malformed at "AEDT 2016"
我尝试过以下区域符号:
- z
- zz
- Z
- ZZ
- ZZZ
我意识到文档确实说 DateTimeFormatter
无法解析时区。我还意识到这些短时区名称是不明确的。但在这种情况下,我只是想获取 LocalDate
,所以我真正想要的是月、日和年。 (注意到小时、分钟和秒也是零吗?)
如果可能的话,我宁愿不必在传递字符串之前将其从字符串中间进行正则表达式废话,因为我传递此格式化程序的东西需要一个 DateTimeFormatter
目前。
有没有办法指定解析时丢弃的某种任意模式的垃圾?我似乎在 API 中找不到它,但这并不一定意味着它不存在。
最佳答案
同时,我将发布我自己的消息解决方法,它使用现有格式模式的混合以及自定义解析器来丢弃时区。
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss ")
.append(DateTimeFormat.forPattern("Z").getPrinter(), new DiscardTimeZoneSymbolParser())
.appendPattern(" yyyy")
.toFormatter();
LocalDate localDate = formatter.parseLocalDate("Tue Jan 05 00:00:00 AEDT 2016");
然后:
public class DiscardTimeZoneSymbolParser implements DateTimeParser {
@Override
public int estimateParsedLength() {
return 4;
}
@Override
public int parseInto(DateTimeParserBucket bucket, @NonNls String text, int position) {
for (int positionFromStart = 0; positionFromStart < 4; positionFromStart++, position++) {
boolean match;
if (position >= text.length()) {
match = false;
} else {
@NonNls
char ch = text.charAt(position);
match = ch >= 'A' && ch <= 'Z';
}
if (!match) {
if (positionFromStart >= 3) { // require 3 characters
return position;
} else {
return ~position;
}
}
}
return position;
}
}
关于java - 使用 Joda 的 DateTimeFormatter 解析时如何忽略时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601626/