diff --git a/poi/src/main/java/org/apache/poi/ss/format/CellDateFormatter.java b/poi/src/main/java/org/apache/poi/ss/format/CellDateFormatter.java index b1d7f24431..4a963d7d3d 100644 --- a/poi/src/main/java/org/apache/poi/ss/format/CellDateFormatter.java +++ b/poi/src/main/java/org/apache/poi/ss/format/CellDateFormatter.java @@ -44,7 +44,7 @@ public class CellDateFormatter extends CellFormatter { private static /* final */ CellDateFormatter SIMPLE_DATE; - private class DatePartHandler implements CellFormatPart.PartHandler { + class DatePartHandler implements CellFormatPart.PartHandler { private int mStart = -1; private int mLen; private int hStart = -1; @@ -94,7 +94,10 @@ public class CellDateFormatter extends CellFormatter { case 'y': case 'Y': mStart = -1; - if (part.length() == 3) + // See https://issues.apache.org/bugzilla/show_bug.cgi?id=53369 + if (part.length() == 1) + part = "yy"; + else if (part.length() == 3) part = "yyyy"; return part.toLowerCase(Locale.ROOT); @@ -125,6 +128,15 @@ public class CellDateFormatter extends CellFormatter { } } + public void updatePositions(int pos, int offset) { + if (pos < hStart) { + hStart += offset; + } + if (pos < mStart) { + mStart += offset; + } + } + public void finish(StringBuffer toAppendTo) { if (hStart >= 0 && !showAmPm) { for (int i = 0; i < hLen; i++) { @@ -155,10 +167,7 @@ public class CellDateFormatter extends CellFormatter { StringBuffer descBuf = CellFormatPart.parseFormat(format, CellFormatType.DATE, partHandler); partHandler.finish(descBuf); - // tweak the format pattern to pass tests on JDK 1.7, - // See https://issues.apache.org/bugzilla/show_bug.cgi?id=53369 - String ptrn = descBuf.toString().replaceAll("((y)(?!y))(?= 0) { fmt.delete(pos, pos + 2); + if (partHandler instanceof CellDateFormatter.DatePartHandler) { + CellDateFormatter.DatePartHandler datePartHandler = (CellDateFormatter.DatePartHandler) partHandler; + datePartHandler.updatePositions(pos, -2); + } } // Now the final pass for quoted chars: Replace any \u0000 with '' pos = 0; while ((pos = fmt.indexOf("\u0000", pos)) >= 0) { fmt.replace(pos, pos + 1, "''"); + if (partHandler instanceof CellDateFormatter.DatePartHandler) { + CellDateFormatter.DatePartHandler datePartHandler = (CellDateFormatter.DatePartHandler) partHandler; + datePartHandler.updatePositions(pos, 1); + } } } diff --git a/poi/src/main/java9/module-info.class b/poi/src/main/java9/module-info.class index 65a7086587..86d7379bf9 100644 Binary files a/poi/src/main/java9/module-info.class and b/poi/src/main/java9/module-info.class differ diff --git a/poi/src/test/java9/module-info.class b/poi/src/test/java9/module-info.class index 2cd1356efd..fabf8f27ed 100644 Binary files a/poi/src/test/java9/module-info.class and b/poi/src/test/java9/module-info.class differ diff --git a/test-data/spreadsheet/DateFormatTests.xlsx b/test-data/spreadsheet/DateFormatTests.xlsx index c6048309b8..31917ca968 100644 Binary files a/test-data/spreadsheet/DateFormatTests.xlsx and b/test-data/spreadsheet/DateFormatTests.xlsx differ