java:将表示两位数年份的字符串转换为四位数

时间:2016-02-15 14:49:41

标签: java android simpledateformat

这个问题已被多次询问,但我有一个问题,我认为这是一个独特的问题。

在这里。

我有一个表示两位数年份的字符串,即写入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平台上工作,只是这个小用途会增加我项目的大小

6 个答案:

答案 0 :(得分:6)

为什么不从格式中删除部分月份和日期?

DateFormat sdfp = new SimpleDateFormat("yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy");
String date = sdff.format(d);

LIVE

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