这个问题已被多次询问,但我有一个问题,我认为这是一个独特的问题。
在这里。
我有一个表示两位数年份的字符串,即写入2016 I输入16
我要求将两位数年份转换为四位数年份,即16年成为2016年。
在完成一些问题和答案后,我做了以下发现
解决方案1
DateFormat sdfp = new SimpleDateFormat("dd.mm.yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd");
String date = sdff.format(d);
这会很棒,但我的案例中只有一年没有一个月或一天,我找不到用这一年创建日期对象的方法。
解决方案2
以上内容可以通过Calendar
对象解决,但不允许输入年份字段的两位数年份。
修改 忘记提及我不能使用Joda-Time,因为我在Android平台上工作,只是这个小用途会增加我项目的大小
答案 0 :(得分:6)
为什么不从格式中删除部分月份和日期?
DateFormat sdfp = new SimpleDateFormat("yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy");
String date = sdff.format(d);
Here是关于SimpleDateFormat
如何解释缩写年份的规则。 (我大胆)
对于使用缩写年份模式(“y”或“yy”)进行解析,
SimpleDateFormat
必须解释相对于某个世纪的缩写年份。它通过将日期调整为在创建SimpleDateFormat
实例之前的80年之前和之后的20年来实现此目的。例如,使用1997年1月1日创建的“MM / dd / yy”模式和SimpleDateFormat
实例,字符串“01/11/12”将被解释为2012年1月11日,而字符串“ 05/04/64“将被解释为1964年5月4日。
答案 1 :(得分:4)
我认为这更简单:
String year = "20" + input;
但是如果你想让用户的生活更轻松,并假设他正在输入一张有效的卡片,那么这个问题很容易:如果他输入2位数字,那么加上(thisYear / 100)。如果这似乎过去曾经过去,那么如果它过去超过90年,那么又增加100个(这将只是在任何一个世纪的最后十年中的情况)
Date now = new Date();
int expYear = (int)(now.getYear()/100) + parseInt(input);
if (expYear < now.getYear() && expYear+90<now.getYear()) {
expYear += 100;
}
答案 2 :(得分:1)
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
}
答案 3 :(得分:0)
你也可以尝试这样的事情:
String input = "16";
String str = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)).substring(0, 2)+input;
System.out.println("str = " + str);
结果:
str = 2016
答案 4 :(得分:0)
一个相当简单的。礼貌Gavriel
String year = "20" + input;
if(input>99)
{
String year= "2"+input;
}
答案 5 :(得分:0)
如果您使用的是Java 8,则可以使用java.time中的Year:
Year year = Year.parse("18", DateTimeFormatter.ofPattern("yy"));
year.toString(); //This returns 2018