diff --git a/src/java/org/apache/poi/hssf/usermodel/DVConstraint.java b/src/java/org/apache/poi/hssf/usermodel/DVConstraint.java index 41f90fbfc..ce8cbf1b1 100644 --- a/src/java/org/apache/poi/hssf/usermodel/DVConstraint.java +++ b/src/java/org/apache/poi/hssf/usermodel/DVConstraint.java @@ -20,7 +20,6 @@ package org.apache.poi.hssf.usermodel; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.Locale; import java.util.regex.Pattern; import org.apache.poi.hssf.model.HSSFFormulaParser; @@ -32,6 +31,7 @@ import org.apache.poi.ss.formula.ptg.NumberPtg; import org.apache.poi.ss.formula.ptg.Ptg; import org.apache.poi.ss.formula.ptg.StringPtg; import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.util.LocaleUtil; /** * Data Validation Constraint @@ -180,7 +180,11 @@ public class DVConstraint implements DataValidationConstraint { throw new IllegalArgumentException("expr1 must be supplied"); } OperatorType.validateSecondArg(comparisonOperator, expr2); - SimpleDateFormat df = dateFormat == null ? null : new SimpleDateFormat(dateFormat, Locale.ROOT); + SimpleDateFormat df = null; + if (dateFormat != null) { + df = new SimpleDateFormat(dateFormat, LocaleUtil.getUserLocale()); + df.setTimeZone(LocaleUtil.getUserTimeZone()); + } // formula1 and value1 are mutually exclusive String formula1 = getFormulaFromTextExpression(expr1); @@ -392,7 +396,8 @@ public class DVConstraint implements DataValidationConstraint { return new FormulaPair(formula1, formula2); } - private Ptg[] createListFormula(HSSFSheet sheet) { + @SuppressWarnings("resource") + private Ptg[] createListFormula(HSSFSheet sheet) { if (_explicitListValues == null) { HSSFWorkbook wb = sheet.getWorkbook(); @@ -417,6 +422,7 @@ public class DVConstraint implements DataValidationConstraint { * @return The parsed token array representing the formula or value specified. * Empty array if both formula and value are null */ + @SuppressWarnings("resource") private static Ptg[] convertDoubleFormula(String formula, Double value, HSSFSheet sheet) { if (formula == null) { if (value == null) { diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index 8fbdd1276..33a5ce6aa 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -17,7 +17,6 @@ package org.apache.poi.hssf.usermodel; -import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; @@ -53,8 +52,6 @@ import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.NumberToTextConverter; import org.apache.poi.util.LocaleUtil; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; /** * High level representation of a cell in a row of a spreadsheet. @@ -69,8 +66,6 @@ import org.apache.poi.util.POILogger; *

*/ public class HSSFCell implements Cell { - private static POILogger log = POILogFactory.getLogger(HSSFCell.class); - private static final String FILE_FORMAT_NAME = "BIFF8"; /** * The maximum number of columns in BIFF8 @@ -990,7 +985,8 @@ public class HSSFCell implements Cell { case CELL_TYPE_NUMERIC: //TODO apply the dataformat for this cell if (HSSFDateUtil.isCellDateFormatted(this)) { - DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale()); + SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale()); + sdf.setTimeZone(LocaleUtil.getUserTimeZone()); return sdf.format(getDateCellValue()); } return String.valueOf(getNumericCellValue()); diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java b/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java index 13abd91e6..ef3eb9315 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFDataFormatter.java @@ -19,7 +19,6 @@ package org.apache.poi.hssf.usermodel; import java.text.DecimalFormat; import java.text.Format; -import java.text.SimpleDateFormat; import java.util.Locale; import org.apache.poi.ss.usermodel.DataFormatter; @@ -33,7 +32,7 @@ import org.apache.poi.util.LocaleUtil; * codes, etc. *

* Internally, formats will be implemented using subclasses of {@link Format} - * such as {@link DecimalFormat} and {@link SimpleDateFormat}. Therefore the + * such as {@link DecimalFormat} and {@link java.text.SimpleDateFormat}. Therefore the * formats used by this class must obey the same pattern rules as these Format * subclasses. This means that only legal number pattern characters ("0", "#", * ".", "," etc.) may appear in number formats. Other characters can be diff --git a/src/java/org/apache/poi/ss/format/CellDateFormatter.java b/src/java/org/apache/poi/ss/format/CellDateFormatter.java index 4027d0276..11c567c4c 100644 --- a/src/java/org/apache/poi/ss/format/CellDateFormatter.java +++ b/src/java/org/apache/poi/ss/format/CellDateFormatter.java @@ -38,17 +38,11 @@ public class CellDateFormatter extends CellFormatter { private final DateFormat dateFmt; private String sFmt; - private final long EXCEL_EPOCH_TIME; - private final Date EXCEL_EPOCH_DATE; + private final Calendar EXCEL_EPOCH_CAL = + LocaleUtil.getLocaleCalendar(1904, 0, 1); private static /* final */ CellDateFormatter SIMPLE_DATE = null; - { - Calendar c = LocaleUtil.getLocaleCalendar(1904, 0, 1, 0, 0, 0); - EXCEL_EPOCH_DATE = c.getTime(); - EXCEL_EPOCH_TIME = c.getTimeInMillis(); - } - private class DatePartHandler implements CellFormatPart.PartHandler { private int mStart = -1; private int mLen; @@ -153,6 +147,7 @@ public class CellDateFormatter extends CellFormatter { // See https://issues.apache.org/bugzilla/show_bug.cgi?id=53369 String ptrn = descBuf.toString().replaceAll("((y)(?!y))(? * Internally, formats will be implemented using subclasses of {@link Format} - * such as {@link DecimalFormat} and {@link SimpleDateFormat}. Therefore the + * such as {@link DecimalFormat} and {@link java.text.SimpleDateFormat}. Therefore the * formats used by this class must obey the same pattern rules as these Format * subclasses. This means that only legal number pattern characters ("0", "#", * ".", "," etc.) may appear in number formats. Other characters can be diff --git a/src/ooxml/java/org/apache/poi/poifs/crypt/dsig/facets/OOXMLSignatureFacet.java b/src/ooxml/java/org/apache/poi/poifs/crypt/dsig/facets/OOXMLSignatureFacet.java index ab3aa070e..8ba8bf239 100644 --- a/src/ooxml/java/org/apache/poi/poifs/crypt/dsig/facets/OOXMLSignatureFacet.java +++ b/src/ooxml/java/org/apache/poi/poifs/crypt/dsig/facets/OOXMLSignatureFacet.java @@ -58,6 +58,7 @@ import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService; import org.apache.poi.poifs.crypt.dsig.services.RelationshipTransformService.RelationshipTransformParameterSpec; +import org.apache.poi.util.LocaleUtil; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.openxmlformats.schemas.xpackage.x2006.digitalSignature.CTSignatureTime; @@ -198,7 +199,7 @@ public class OOXMLSignatureFacet extends SignatureFacet { * SignatureTime */ DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT); - fmt.setTimeZone(TimeZone.getTimeZone("UTC")); + fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC); String nowStr = fmt.format(signatureConfig.getExecutionTime()); LOG.log(POILogger.DEBUG, "now: " + nowStr); diff --git a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java index b55360200..f6ad11f1e 100644 --- a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java +++ b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFExportToXml.java @@ -45,6 +45,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.util.DocumentHelper; +import org.apache.poi.util.LocaleUtil; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFMap; import org.apache.poi.xssf.usermodel.XSSFRow; @@ -316,6 +317,7 @@ public class XSSFExportToXml implements Comparator{ private String getFormattedDate(XSSFCell cell) { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT); + sdf.setTimeZone(LocaleUtil.getUserTimeZone()); return sdf.format(cell.getDateCellValue()); } diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java index e88667f47..3e6dbc543 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java @@ -523,6 +523,7 @@ public class SXSSFCell implements Cell { * workbook.getCellStyleAt(0) * @see org.apache.poi.ss.usermodel.Workbook#getCellStyleAt(short) */ + @SuppressWarnings("resource") public CellStyle getCellStyle() { if(_style == null){ @@ -655,6 +656,7 @@ public class SXSSFCell implements Cell { case CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(this)) { DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale()); + sdf.setTimeZone(LocaleUtil.getUserTimeZone()); return sdf.format(getDateCellValue()); } return getNumericCellValue() + ""; diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 0e2c9c549..06dec8da5 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -21,7 +21,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import java.util.Locale; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.formula.FormulaParser; @@ -42,6 +41,7 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.util.Internal; +import org.apache.poi.util.LocaleUtil; import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.model.StylesTable; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; @@ -452,6 +452,7 @@ public final class XSSFCell implements Cell { cellFormula.setRef(range.formatAsString()); } + @SuppressWarnings("resource") private void setFormula(String formula, int formulaType) { XSSFWorkbook wb = _row.getSheet().getWorkbook(); if (formula == null) { @@ -841,7 +842,8 @@ public final class XSSFCell implements Cell { return getCellFormula(); case CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(this)) { - DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.ROOT); + DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", LocaleUtil.getUserLocale()); + sdf.setTimeZone(LocaleUtil.getUserTimeZone()); return sdf.format(getDateCellValue()); } return Double.toString(getNumericCellValue()); diff --git a/src/scratchpad/testcases/org/apache/poi/hmef/TestAttachments.java b/src/scratchpad/testcases/org/apache/poi/hmef/TestAttachments.java index 18ccde4df..18f59725b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hmef/TestAttachments.java +++ b/src/scratchpad/testcases/org/apache/poi/hmef/TestAttachments.java @@ -20,7 +20,8 @@ package org.apache.poi.hmef; import java.text.DateFormat; import java.util.List; import java.util.Locale; -import java.util.TimeZone; + +import org.apache.poi.util.LocaleUtil; public final class TestAttachments extends HMEFTest { private HMEFMessage quick; @@ -85,7 +86,7 @@ public final class TestAttachments extends HMEFTest { DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK ); - fmt.setTimeZone(TimeZone.getTimeZone("UTC")); + fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC); // They should all have the same date on them assertEquals("28-Apr-2010 12:40:56", fmt.format( attachments.get(0).getModifiedDate())); diff --git a/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestMAPIAttributes.java b/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestMAPIAttributes.java index c3707a811..2178e6a76 100644 --- a/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestMAPIAttributes.java +++ b/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestMAPIAttributes.java @@ -21,14 +21,14 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.text.DateFormat; import java.util.Locale; -import java.util.TimeZone; - -import junit.framework.TestCase; import org.apache.poi.POIDataSamples; import org.apache.poi.hmef.HMEFMessage; import org.apache.poi.hsmf.datatypes.MAPIProperty; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LocaleUtil; + +import junit.framework.TestCase; public final class TestMAPIAttributes extends TestCase { private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance(); @@ -161,7 +161,7 @@ public final class TestMAPIAttributes extends TestCase { DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK ); - fmt.setTimeZone(TimeZone.getTimeZone("UTC")); + fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC); assertEquals("15-Dec-2010 14:46:31", fmt.format(date.getDate())); // RTF diff --git a/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestTNEFAttributes.java b/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestTNEFAttributes.java index fcea77f02..cd13b94b3 100644 --- a/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestTNEFAttributes.java +++ b/src/scratchpad/testcases/org/apache/poi/hmef/attribute/TestTNEFAttributes.java @@ -20,15 +20,15 @@ package org.apache.poi.hmef.attribute; import java.io.ByteArrayInputStream; import java.text.DateFormat; import java.util.Locale; -import java.util.TimeZone; - -import junit.framework.TestCase; import org.apache.poi.POIDataSamples; import org.apache.poi.hmef.Attachment; import org.apache.poi.hmef.HMEFMessage; import org.apache.poi.hsmf.datatypes.MAPIProperty; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LocaleUtil; + +import junit.framework.TestCase; public final class TestTNEFAttributes extends TestCase { private static final POIDataSamples _samples = POIDataSamples.getHMEFInstance(); @@ -162,7 +162,7 @@ public final class TestTNEFAttributes extends TestCase { DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.UK ); - fmt.setTimeZone(TimeZone.getTimeZone("UTC")); + fmt.setTimeZone(LocaleUtil.TIMEZONE_UTC); assertEquals("28-Apr-2010 12:40:56", fmt.format(date.getDate())); } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java index 4abffc5ce..3b2588f07 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDataFormatter.java @@ -241,6 +241,7 @@ public final class TestHSSFDataFormatter { String monthPtrn = fmt.indexOf("mmmm") != -1 ? "MMMM" : "MMM"; // this line is intended to compute how "July" would look like in the current locale SimpleDateFormat sdf = new SimpleDateFormat(monthPtrn, LocaleUtil.getUserLocale()); + sdf.setTimeZone(LocaleUtil.getUserTimeZone()); Calendar calDef = LocaleUtil.getLocaleCalendar(2010, 6, 15, 0, 0, 0); String jul = sdf.format(calDef.getTime()); // special case for MMMMM = 1st letter of month name