7177315: SimpleDateFormat parses wrong 2-digit year if input contains spaces
Reviewed-by: peytoia
This commit is contained in:
parent
5b5c7e541c
commit
f1d2e9ae5a
@ -1845,6 +1845,8 @@ public class SimpleDateFormat extends DateFormat {
|
||||
}
|
||||
++pos.index;
|
||||
}
|
||||
// Remember the actual start index
|
||||
int actualStart = pos.index;
|
||||
|
||||
parsing:
|
||||
{
|
||||
@ -1924,9 +1926,9 @@ public class SimpleDateFormat extends DateFormat {
|
||||
// we made adjustments to place the 2-digit year in the proper
|
||||
// century, for parsed strings from "00" to "99". Any other string
|
||||
// is treated literally: "2250", "-1", "1", "002".
|
||||
if (count <= 2 && (pos.index - start) == 2
|
||||
&& Character.isDigit(text.charAt(start))
|
||||
&& Character.isDigit(text.charAt(start+1))) {
|
||||
if (count <= 2 && (pos.index - actualStart) == 2
|
||||
&& Character.isDigit(text.charAt(actualStart))
|
||||
&& Character.isDigit(text.charAt(actualStart + 1))) {
|
||||
// Assume for example that the defaultCenturyStart is 6/18/1903.
|
||||
// This means that two-digit years will be forced into the range
|
||||
// 6/18/1903 to 6/17/2003. As a result, years 00, 01, and 02
|
||||
|
58
jdk/test/java/text/Format/DateFormat/Bug7177315.java
Normal file
58
jdk/test/java/text/Format/DateFormat/Bug7177315.java
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 7177315
|
||||
* @summary Make sure that space characters are properly skipped when
|
||||
* parsing 2-digit year values.
|
||||
*/
|
||||
|
||||
import java.text.*;
|
||||
import java.util.*;
|
||||
|
||||
public class Bug7177315 {
|
||||
private static final String EXPECTED = "01/01/2012";
|
||||
private static final String[] DATA = {
|
||||
"01/01/12",
|
||||
"01/01/ 12",
|
||||
"01/01/ 12",
|
||||
"1/1/12",
|
||||
"1/1/ 12"
|
||||
};
|
||||
|
||||
public static void main (String[] args) throws ParseException {
|
||||
SimpleDateFormat parseFormat = new SimpleDateFormat("MM/dd/yy", Locale.US);
|
||||
Calendar cal = new GregorianCalendar(2012-80, Calendar.JANUARY, 1);
|
||||
parseFormat.set2DigitYearStart(cal.getTime());
|
||||
SimpleDateFormat fmtFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
|
||||
|
||||
for (String text : DATA) {
|
||||
Date date = parseFormat.parse(text);
|
||||
String got = fmtFormat.format(date);
|
||||
if (!EXPECTED.equals(got)) {
|
||||
throw new RuntimeException("got: " + got + ", expected: " + EXPECTED);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user