java:将表示两位数年份的字符串转换为四位数字
java: Convert a string which represents a two digit year to four digits
这个问题已被问过很多次,但我有一个问题使它成为一个独特的问题。
开始了。
我有一个代表两位数年份的字符串,即写 2016 我输入 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 平台上工作,它会增加我的项目的大小,只是为了这个小用途
我觉得这样简单多了:
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;
}
为什么不直接从格式中删除月份和日期部分?
DateFormat sdfp = new SimpleDateFormat("yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy");
String date = sdff.format(d);
Here 是关于如何 SimpleDateFormat
解释缩写年份的规则。 (由我加粗)
For parsing with the abbreviated year pattern ("y" or "yy"), SimpleDateFormat
must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time the SimpleDateFormat
instance is created. For example, using a pattern of "MM/dd/yy" and a SimpleDateFormat
instance created on Jan 1, 1997, the string "01/11/12" would be interpreted as Jan 11, 2012 while the string "05/04/64" would be interpreted as May 4, 1964.
您也可以尝试这样的操作:
String input = "16";
String str = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)).substring(0, 2)+input;
System.out.println("str = " + str);
结果:
str = 2016
一个相当简单的。礼貌加夫里尔
String year = "20" + input;
if(input>99)
{
String year= "2"+input;
}
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
}
如果您使用 java 8:
,则可以使用 java.time 的年份
Year year = Year.parse("18", DateTimeFormatter.ofPattern("yy"));
year.toString(); //This returns 2018
这个问题已被问过很多次,但我有一个问题使它成为一个独特的问题。
开始了。
我有一个代表两位数年份的字符串,即写 2016 我输入 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 平台上工作,它会增加我的项目的大小,只是为了这个小用途
我觉得这样简单多了:
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;
}
为什么不直接从格式中删除月份和日期部分?
DateFormat sdfp = new SimpleDateFormat("yy");
Date d = sdfp.parse(input);
DateFormat sdff = new SimpleDateFormat("yyyy");
String date = sdff.format(d);
Here 是关于如何 SimpleDateFormat
解释缩写年份的规则。 (由我加粗)
For parsing with the abbreviated year pattern ("y" or "yy"),
SimpleDateFormat
must interpret the abbreviated year relative to some century. It does this by adjusting dates to be within 80 years before and 20 years after the time theSimpleDateFormat
instance is created. For example, using a pattern of "MM/dd/yy" and aSimpleDateFormat
instance created on Jan 1, 1997, the string "01/11/12" would be interpreted as Jan 11, 2012 while the string "05/04/64" would be interpreted as May 4, 1964.
您也可以尝试这样的操作:
String input = "16";
String str = String.valueOf(Calendar.getInstance().get(Calendar.YEAR)).substring(0, 2)+input;
System.out.println("str = " + str);
结果:
str = 2016
一个相当简单的。礼貌加夫里尔
String year = "20" + input;
if(input>99)
{
String year= "2"+input;
}
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
}
如果您使用 java 8:
,则可以使用 java.time 的年份Year year = Year.parse("18", DateTimeFormatter.ofPattern("yy"));
year.toString(); //This returns 2018