public static int adjustOneOrTwoDigitYearInput(int year) {
return adjustOneOrTwoDigitYearInput(year, Year.now().getValue());
}
public static int adjustOneOrTwoDigitYearInput(int inputYear, int referenceYear) {
if(inputYear > 99) {
return inputYear;
}
int currentCentury = referenceYear / 100 * 100;
int currentCenturyYear = currentCentury + inputYear;
int upperLimit = referenceYear + 20;
int lowerLimit = referenceYear - 79;
// initially place it in current century
int adjusted = currentCenturyYear;
if(adjusted> upperLimit) {
// shift a century down
adjusted -= 100;
}
else if(adjusted < lowerLimit) {
// shift a century up
adjusted += 100;
}
return adjusted;
}
一些测试:
@Test
public void test_adjustOneOrTwoDigitYearInput()
{
assertEquals(2017, adjustOneOrTwoDigitYearInput(17, 2017));
assertEquals(2037, adjustOneOrTwoDigitYearInput(37, 2017)); // +20
assertEquals(1938, adjustOneOrTwoDigitYearInput(38, 2017)); // +21
assertEquals(2000, adjustOneOrTwoDigitYearInput(0, 2017)); // 0
assertEquals(1999, adjustOneOrTwoDigitYearInput(99, 2017)); // 99
assertEquals(2078, adjustOneOrTwoDigitYearInput(78, 2078));
assertEquals(2098, adjustOneOrTwoDigitYearInput(98, 2078)); // + 20
assertEquals(1999, adjustOneOrTwoDigitYearInput(99, 2078)); // + 21 / 99
assertEquals(2000, adjustOneOrTwoDigitYearInput(0, 2078)); // 0
assertEquals(1990, adjustOneOrTwoDigitYearInput(90, 1990));
assertEquals(1999, adjustOneOrTwoDigitYearInput(99, 1990)); // 99
assertEquals(2000, adjustOneOrTwoDigitYearInput(0, 1990)); // 0
assertEquals(2010, adjustOneOrTwoDigitYearInput(10, 1990)); // +20
assertEquals(1911, adjustOneOrTwoDigitYearInput(11, 1990)); // +21
}