DateTimeFormatter 是怎么将它纠正的,在哪一块代码体现
时间: 2024-01-06 15:21:01 浏览: 30
`DateTimeFormatter` 中的纠正逻辑是在内部实现的,具体纠正的代码位于 `java.time.format.DateTimeBuilder#parse` 方法中。在该方法中,如果发现日期时间字符串中的年份不是四位数,则会在其前面补零,使其变为四位数的年份。以下是 `DateTimeBuilder#parse` 方法的部分代码:
```java
int newStart = parseField(CHARACTERISTICS[newIdx], text, start, newFieldPosition);
if (newStart < 0) {
if ( ~newStart == (1<<PARSED_EXPIRE_INDEX)) {
// parsing stopped because end of input reached
break;
}
// parsing stopped because a mandatory field was missing
int i = ~newStart;
throw new DateTimeParseException("Text '" + text + "' could not be parsed: " +
"Unable to obtain " + FIELD_NAME[i] + " from " + text, text, i);
}
if (newStart <= start) {
throw new DateTimeParseException("Text '" + text + "' could not be parsed: " +
"Conflict found: " + FIELD_NAME[newIdx] + " " + newText +
" differs from " + FIELD_NAME[fieldIndex] + " " + text.substring(start, newStart), text, start);
}
if (newIdx >= 0 && (fieldIndex < 0 || (newIdx < fieldIndex))) {
if (newIdx == YEAR && newText.length() == 3) {
// special case for year with 3 digits
int year = Integer.parseInt(newText);
if (year >= 0 && year <= 99) {
year += year < 30 ? 2000 : 1900;
}
setFieldValue(YEAR, year);
start = newStart;
continue;
}
setFieldValue(newIdx, parseInt(newText));
setFieldWidth(newIdx, newText.length());
start = newStart;
fieldIndex = newIdx;
}
```
在这段代码中,当解析日期时间字符串时,如果发现当前解析的年份字段的长度为3,即出现了 "yyy" 的格式错误,就会将其转换为四位数的年份。这个特殊的纠正逻辑就是通过 `if (newIdx == YEAR && newText.length() == 3)` 这个判断语句实现的,然后通过一些计算,将三位数的年份转换为四位数的年份,并将其设置到 `DateTimeBuilder` 中。