From 99300501befb9a40cb4cfcbe430d07f02dfa8b05 Mon Sep 17 00:00:00 2001 From: Alex Smolya Date: Mon, 17 Aug 2026 22:42:46 +0200 Subject: [PATCH 1/7] feat: add ZonedDateTime converters --- .../converters/DefaultConverterLoader.java | 7 ++ .../ZonedDateTimeDateConverter.java | 57 ++++++++++ .../ZonedDateTimeNumberConverter.java | 73 +++++++++++++ .../ZonedDateTimeStringConverter.java | 77 +++++++++++++ .../converter/ZonedDateTimeConverterTest.java | 102 ++++++++++++++++++ 5 files changed, 316 insertions(+) create mode 100644 fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java create mode 100644 fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java create mode 100644 fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java create mode 100644 fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java index f17d9b62c..a0b37d804 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/DefaultConverterLoader.java @@ -78,6 +78,9 @@ import org.apache.fesod.sheet.converters.string.StringNumberConverter; import org.apache.fesod.sheet.converters.string.StringStringConverter; import org.apache.fesod.sheet.converters.url.UrlImageConverter; +import org.apache.fesod.sheet.converters.zoneddatetime.ZonedDateTimeDateConverter; +import org.apache.fesod.sheet.converters.zoneddatetime.ZonedDateTimeNumberConverter; +import org.apache.fesod.sheet.converters.zoneddatetime.ZonedDateTimeStringConverter; /** * Load default handler @@ -122,6 +125,8 @@ private static void initAllConverter() { putAllConverter(new LocalTimeNumberConverter()); putAllConverter(new LocalTimeStringConverter()); + putAllConverter(new ZonedDateTimeNumberConverter()); + putAllConverter(new ZonedDateTimeStringConverter()); putAllConverter(new DoubleBooleanConverter()); putAllConverter(new DoubleNumberConverter()); @@ -160,6 +165,7 @@ private static void initDefaultWriteConverter() { putWriteConverter(new LocalDateTimeDateConverter()); putWriteConverter(new LocalDateDateConverter()); putWriteConverter(new LocalTimeDateConverter()); + putWriteConverter(new ZonedDateTimeDateConverter()); putWriteConverter(new DoubleNumberConverter()); putWriteConverter(new FloatNumberConverter()); putWriteConverter(new IntegerNumberConverter()); @@ -181,6 +187,7 @@ private static void initDefaultWriteConverter() { putWriteStringConverter(new LocalDateStringConverter()); putWriteStringConverter(new LocalDateTimeStringConverter()); putWriteStringConverter(new LocalTimeStringConverter()); + putWriteStringConverter(new ZonedDateTimeStringConverter()); putWriteStringConverter(new DoubleStringConverter()); putWriteStringConverter(new FloatStringConverter()); putWriteStringConverter(new IntegerStringConverter()); diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java new file mode 100644 index 000000000..cc6d851c8 --- /dev/null +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. + * + * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. + */ + +package org.apache.fesod.sheet.converters.zoneddatetime; + +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import org.apache.fesod.sheet.converters.Converter; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.util.DateUtils; +import org.apache.fesod.sheet.util.WorkBookUtil; + +/** ZonedDateTime and date converter. */ +public class ZonedDateTimeDateConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return ZonedDateTime.class; + } + + @Override + public WriteCellData convertToExcelData( + ZonedDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) + throws Exception { + LocalDateTime localDateTime = value.toLocalDateTime(); + WriteCellData cellData = new WriteCellData<>(localDateTime); + String format = null; + if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { + format = contentProperty.getDateTimeFormatProperty().getFormat(); + } + WorkBookUtil.fillDataFormat(cellData, format, DateUtils.defaultDateFormat); + return cellData; + } +} diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java new file mode 100644 index 000000000..ed602ff4b --- /dev/null +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. + * + * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. + */ + +package org.apache.fesod.sheet.converters.zoneddatetime; + +import java.math.BigDecimal; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import org.apache.fesod.sheet.converters.Converter; +import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.ReadCellData; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.util.DateUtils; +import org.apache.poi.ss.usermodel.DateUtil; + +/** ZonedDateTime and number converter. */ +public class ZonedDateTimeNumberConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return ZonedDateTime.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.NUMBER; + } + + @Override + public ZonedDateTime convertToJavaData( + ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + boolean use1904windowing = globalConfiguration.getUse1904windowing(); + if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { + use1904windowing = contentProperty.getDateTimeFormatProperty().getUse1904windowing(); + } + return DateUtils.getLocalDateTime(cellData.getNumberValue().doubleValue(), use1904windowing) + .atZone(ZoneId.systemDefault()); + } + + @Override + public WriteCellData convertToExcelData( + ZonedDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + boolean use1904windowing = globalConfiguration.getUse1904windowing(); + if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { + use1904windowing = contentProperty.getDateTimeFormatProperty().getUse1904windowing(); + } + return new WriteCellData<>( + BigDecimal.valueOf(DateUtil.getExcelDate(value.toLocalDateTime(), use1904windowing))); + } +} diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java new file mode 100644 index 000000000..678c99f5e --- /dev/null +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. + * + * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. + */ + +package org.apache.fesod.sheet.converters.zoneddatetime; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Locale; +import org.apache.fesod.sheet.converters.Converter; +import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.ReadCellData; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; + +/** ZonedDateTime and string converter. */ +public class ZonedDateTimeStringConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return ZonedDateTime.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public ZonedDateTime convertToJavaData( + ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + DateTimeFormatter formatter = formatter(contentProperty, globalConfiguration.getLocale()); + try { + return ZonedDateTime.parse(cellData.getStringValue(), formatter); + } catch (DateTimeParseException e) { + return LocalDateTime.parse(cellData.getStringValue(), formatter).atZone(ZoneId.systemDefault()); + } + } + + @Override + public WriteCellData convertToExcelData( + ZonedDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(value.format(formatter(contentProperty, globalConfiguration.getLocale()))); + } + + private DateTimeFormatter formatter(ExcelContentProperty contentProperty, Locale locale) { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return DateTimeFormatter.ISO_ZONED_DATE_TIME; + } + return DateTimeFormatter.ofPattern( + contentProperty.getDateTimeFormatProperty().getFormat(), locale); + } +} diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java new file mode 100644 index 000000000..de9a01da7 --- /dev/null +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. + * + * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. + */ + +package org.apache.fesod.sheet.converter; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import org.apache.fesod.sheet.converters.ConverterKeyBuild; +import org.apache.fesod.sheet.converters.DefaultConverterLoader; +import org.apache.fesod.sheet.converters.zoneddatetime.ZonedDateTimeDateConverter; +import org.apache.fesod.sheet.converters.zoneddatetime.ZonedDateTimeNumberConverter; +import org.apache.fesod.sheet.converters.zoneddatetime.ZonedDateTimeStringConverter; +import org.apache.fesod.sheet.enums.CellDataTypeEnum; +import org.apache.fesod.sheet.metadata.GlobalConfiguration; +import org.apache.fesod.sheet.metadata.data.ReadCellData; +import org.apache.fesod.sheet.metadata.data.WriteCellData; +import org.apache.fesod.sheet.metadata.property.DateTimeFormatProperty; +import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.junit.jupiter.api.Test; + +class ZonedDateTimeConverterTest { + private static final ZonedDateTime VALUE = ZonedDateTime.of(2020, 1, 2, 3, 4, 5, 0, ZoneId.of("UTC")); + + @Test + void dateConverterDropsZoneWhilePreservingLocalDateTime() throws Exception { + WriteCellData result = + new ZonedDateTimeDateConverter().convertToExcelData(VALUE, null, new GlobalConfiguration()); + assertEquals(CellDataTypeEnum.DATE, result.getType()); + assertEquals(VALUE.toLocalDateTime(), result.getDateValue()); + } + + @Test + void numberConverterDropsZoneWhilePreservingLocalDateTime() { + ZonedDateTimeNumberConverter converter = new ZonedDateTimeNumberConverter(); + GlobalConfiguration globalConfiguration = new GlobalConfiguration(); + WriteCellData written = converter.convertToExcelData(VALUE, null, globalConfiguration); + ZonedDateTime read = + converter.convertToJavaData(new ReadCellData<>(written.getNumberValue()), null, globalConfiguration); + assertEquals(VALUE.toLocalDateTime(), read.toLocalDateTime()); + assertEquals(ZoneId.systemDefault(), read.getZone()); + } + + @Test + void stringConverterPreservesZoneInIsoText() throws Exception { + ZonedDateTimeStringConverter converter = new ZonedDateTimeStringConverter(); + GlobalConfiguration globalConfiguration = new GlobalConfiguration(); + WriteCellData written = converter.convertToExcelData(VALUE, null, globalConfiguration); + assertEquals( + VALUE, + converter.convertToJavaData(new ReadCellData<>(written.getStringValue()), null, globalConfiguration)); + } + + @Test + void stringConverterUsesConfiguredPattern() throws Exception { + ZonedDateTimeStringConverter converter = new ZonedDateTimeStringConverter(); + ExcelContentProperty property = new ExcelContentProperty(); + property.setDateTimeFormatProperty(new DateTimeFormatProperty("yyyy-MM-dd HH:mm:ss Z", false)); + GlobalConfiguration globalConfiguration = new GlobalConfiguration(); + assertEquals( + "2020-01-02 03:04:05 +0000", + converter + .convertToExcelData(VALUE, property, globalConfiguration) + .getStringValue()); + } + + @Test + void convertersAreRegisteredForSupportedDirections() { + assertEquals( + ZonedDateTimeDateConverter.class, + DefaultConverterLoader.loadDefaultWriteConverter() + .get(ConverterKeyBuild.buildKey(ZonedDateTime.class)) + .getClass()); + assertEquals( + 2, + DefaultConverterLoader.loadAllConverter().entrySet().stream() + .filter(entry -> entry.getKey().getClazz() == ZonedDateTime.class) + .count()); + } +} From 249ece5114d85bb953e57cbb6e19a4ff8c31fa3e Mon Sep 17 00:00:00 2001 From: Alex Smolya Date: Wed, 19 Aug 2026 19:54:32 +0200 Subject: [PATCH 2/7] fix(converter): tag ZonedDateTimeConverterTest with UNIT and handle empty format pattern - Add @Tag(Tags.UNIT) to ZonedDateTimeConverterTest following repository conventions - Handle empty or null format strings in ZonedDateTimeStringConverter by falling back to ISO_ZONED_DATE_TIME - Add regression coverage for empty and null format patterns --- .../ZonedDateTimeStringConverter.java | 5 +++- .../converter/ZonedDateTimeConverterTest.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java index 678c99f5e..ba3fc6bdd 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java @@ -31,6 +31,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Locale; +import org.apache.fesod.common.util.StringUtils; import org.apache.fesod.sheet.converters.Converter; import org.apache.fesod.sheet.enums.CellDataTypeEnum; import org.apache.fesod.sheet.metadata.GlobalConfiguration; @@ -68,7 +69,9 @@ public WriteCellData convertToExcelData( } private DateTimeFormatter formatter(ExcelContentProperty contentProperty, Locale locale) { - if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + if (contentProperty == null + || contentProperty.getDateTimeFormatProperty() == null + || StringUtils.isEmpty(contentProperty.getDateTimeFormatProperty().getFormat())) { return DateTimeFormatter.ISO_ZONED_DATE_TIME; } return DateTimeFormatter.ofPattern( diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java index de9a01da7..0ad877036 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java @@ -39,8 +39,11 @@ import org.apache.fesod.sheet.metadata.data.WriteCellData; import org.apache.fesod.sheet.metadata.property.DateTimeFormatProperty; import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.testkit.Tags; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +@Tag(Tags.UNIT) class ZonedDateTimeConverterTest { private static final ZonedDateTime VALUE = ZonedDateTime.of(2020, 1, 2, 3, 4, 5, 0, ZoneId.of("UTC")); @@ -86,6 +89,29 @@ void stringConverterUsesConfiguredPattern() throws Exception { .getStringValue()); } + @Test + void stringConverterWithEmptyOrNullPatternFallsBackToIso() throws Exception { + ZonedDateTimeStringConverter converter = new ZonedDateTimeStringConverter(); + GlobalConfiguration globalConfiguration = new GlobalConfiguration(); + + ExcelContentProperty emptyProperty = new ExcelContentProperty(); + emptyProperty.setDateTimeFormatProperty(new DateTimeFormatProperty("", false)); + WriteCellData writtenEmpty = converter.convertToExcelData(VALUE, emptyProperty, globalConfiguration); + assertEquals( + VALUE, + converter.convertToJavaData( + new ReadCellData<>(writtenEmpty.getStringValue()), emptyProperty, globalConfiguration)); + + ExcelContentProperty nullFormatProperty = new ExcelContentProperty(); + nullFormatProperty.setDateTimeFormatProperty(new DateTimeFormatProperty(null, false)); + WriteCellData writtenNullFormat = + converter.convertToExcelData(VALUE, nullFormatProperty, globalConfiguration); + assertEquals( + VALUE, + converter.convertToJavaData( + new ReadCellData<>(writtenNullFormat.getStringValue()), nullFormatProperty, globalConfiguration)); + } + @Test void convertersAreRegisteredForSupportedDirections() { assertEquals( From 9ee448272e20da1b62d672b3e0cd34219ea2a570 Mon Sep 17 00:00:00 2001 From: Alex Smolya Date: Wed, 19 Aug 2026 21:43:47 +0200 Subject: [PATCH 3/7] style(converter): apply spotless formatting to ZonedDateTime converter and test --- .../zoneddatetime/ZonedDateTimeStringConverter.java | 3 ++- .../fesod/sheet/converter/ZonedDateTimeConverterTest.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java index ba3fc6bdd..ea5e8344b 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java @@ -71,7 +71,8 @@ public WriteCellData convertToExcelData( private DateTimeFormatter formatter(ExcelContentProperty contentProperty, Locale locale) { if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null - || StringUtils.isEmpty(contentProperty.getDateTimeFormatProperty().getFormat())) { + || StringUtils.isEmpty( + contentProperty.getDateTimeFormatProperty().getFormat())) { return DateTimeFormatter.ISO_ZONED_DATE_TIME; } return DateTimeFormatter.ofPattern( diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java index 0ad877036..cd96412c4 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java @@ -109,7 +109,9 @@ void stringConverterWithEmptyOrNullPatternFallsBackToIso() throws Exception { assertEquals( VALUE, converter.convertToJavaData( - new ReadCellData<>(writtenNullFormat.getStringValue()), nullFormatProperty, globalConfiguration)); + new ReadCellData<>(writtenNullFormat.getStringValue()), + nullFormatProperty, + globalConfiguration)); } @Test From 4632653f6f41eaa6e9d7fd0f0aceed6ab72b5a75 Mon Sep 17 00:00:00 2001 From: Alex Smolya <127655982+alexsmolya@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:30:00 +0200 Subject: [PATCH 4/7] test(converter): add unit tests for use1904windowing in ZonedDateTime converters --- .../converter/ZonedDateTimeConverterTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java index cd96412c4..0b7362698 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java @@ -26,6 +26,8 @@ package org.apache.fesod.sheet.converter; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import java.math.BigDecimal; import java.time.ZoneId; import java.time.ZonedDateTime; import org.apache.fesod.sheet.converters.ConverterKeyBuild; @@ -40,6 +42,7 @@ import org.apache.fesod.sheet.metadata.property.DateTimeFormatProperty; import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; import org.apache.fesod.sheet.testkit.Tags; +import org.apache.poi.ss.usermodel.DateUtil; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -66,6 +69,49 @@ void numberConverterDropsZoneWhilePreservingLocalDateTime() { assertEquals(ZoneId.systemDefault(), read.getZone()); } + @Test + void numberConverterSupports1904Windowing() { + ZonedDateTimeNumberConverter converter = new ZonedDateTimeNumberConverter(); + + // 1. Configured via GlobalConfiguration + GlobalConfiguration global1900 = new GlobalConfiguration(); + GlobalConfiguration global1904 = new GlobalConfiguration(); + global1904.setUse1904windowing(Boolean.TRUE); + + WriteCellData written1900 = converter.convertToExcelData(VALUE, null, global1900); + WriteCellData written1904 = converter.convertToExcelData(VALUE, null, global1904); + + assertEquals( + BigDecimal.valueOf(DateUtil.getExcelDate(VALUE.toLocalDateTime(), false)), + written1900.getNumberValue()); + assertEquals( + BigDecimal.valueOf(DateUtil.getExcelDate(VALUE.toLocalDateTime(), true)), written1904.getNumberValue()); + assertNotEquals(written1900.getNumberValue(), written1904.getNumberValue()); + + ZonedDateTime read1904 = + converter.convertToJavaData(new ReadCellData<>(written1904.getNumberValue()), null, global1904); + assertEquals(VALUE.toLocalDateTime(), read1904.toLocalDateTime()); + assertEquals(ZoneId.systemDefault(), read1904.getZone()); + + ZonedDateTime read1904With1900 = + converter.convertToJavaData(new ReadCellData<>(written1904.getNumberValue()), null, global1900); + assertNotEquals(VALUE.toLocalDateTime(), read1904With1900.toLocalDateTime()); + + // 2. Configured via ExcelContentProperty + ExcelContentProperty property1904 = new ExcelContentProperty(); + property1904.setDateTimeFormatProperty(new DateTimeFormatProperty("yyyy-MM-dd HH:mm:ss", true)); + + WriteCellData writtenProperty1904 = converter.convertToExcelData(VALUE, property1904, global1900); + assertEquals( + BigDecimal.valueOf(DateUtil.getExcelDate(VALUE.toLocalDateTime(), true)), + writtenProperty1904.getNumberValue()); + + ZonedDateTime readProperty1904 = converter.convertToJavaData( + new ReadCellData<>(writtenProperty1904.getNumberValue()), property1904, global1900); + assertEquals(VALUE.toLocalDateTime(), readProperty1904.toLocalDateTime()); + assertEquals(ZoneId.systemDefault(), readProperty1904.getZone()); + } + @Test void stringConverterPreservesZoneInIsoText() throws Exception { ZonedDateTimeStringConverter converter = new ZonedDateTimeStringConverter(); From 85085fd8325af0adfc933c15465063a62d21b3d2 Mon Sep 17 00:00:00 2001 From: Alex Smolya Date: Wed, 26 Aug 2026 18:25:25 +0200 Subject: [PATCH 5/7] fix(converter): normalize empty ZonedDateTime formats --- .../ZonedDateTimeDateConverter.java | 10 ++++------ .../ZonedDateTimeNumberConverter.java | 6 ------ .../ZonedDateTimeStringConverter.java | 9 ++------- .../apache/fesod/sheet/util/DateUtils.java | 9 ++++++++- .../converter/ZonedDateTimeConverterTest.java | 20 +++++++++++++------ 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java index cc6d851c8..212ba091f 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeDateConverter.java @@ -17,16 +17,11 @@ * under the License. */ -/* - * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. - * - * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. - */ - package org.apache.fesod.sheet.converters.zoneddatetime; import java.time.LocalDateTime; import java.time.ZonedDateTime; +import org.apache.fesod.common.util.StringUtils; import org.apache.fesod.sheet.converters.Converter; import org.apache.fesod.sheet.metadata.GlobalConfiguration; import org.apache.fesod.sheet.metadata.data.WriteCellData; @@ -50,6 +45,9 @@ public WriteCellData convertToExcelData( String format = null; if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { format = contentProperty.getDateTimeFormatProperty().getFormat(); + if (StringUtils.isEmpty(format)) { + format = null; + } } WorkBookUtil.fillDataFormat(cellData, format, DateUtils.defaultDateFormat); return cellData; diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java index ed602ff4b..9debf7c95 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java @@ -17,12 +17,6 @@ * under the License. */ -/* - * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. - * - * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. - */ - package org.apache.fesod.sheet.converters.zoneddatetime; import java.math.BigDecimal; diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java index ea5e8344b..9d3bc6198 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java @@ -17,12 +17,6 @@ * under the License. */ -/* - * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. - * - * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. - */ - package org.apache.fesod.sheet.converters.zoneddatetime; import java.time.LocalDateTime; @@ -38,6 +32,7 @@ import org.apache.fesod.sheet.metadata.data.ReadCellData; import org.apache.fesod.sheet.metadata.data.WriteCellData; import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; +import org.apache.fesod.sheet.util.DateUtils; /** ZonedDateTime and string converter. */ public class ZonedDateTimeStringConverter implements Converter { @@ -75,7 +70,7 @@ private DateTimeFormatter formatter(ExcelContentProperty contentProperty, Locale contentProperty.getDateTimeFormatProperty().getFormat())) { return DateTimeFormatter.ISO_ZONED_DATE_TIME; } - return DateTimeFormatter.ofPattern( + return DateUtils.getCacheDateTimeFormat( contentProperty.getDateTimeFormatProperty().getFormat(), locale); } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java index 9fd5365a1..85df9fafc 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java @@ -375,7 +375,14 @@ public static boolean isDate1904(ExcelContentProperty contentProperty, GlobalCon return globalUse1904windowing != null && globalUse1904windowing; } - private static DateTimeFormatter getCacheDateTimeFormat(String dateFormat, Locale locale) { + /** + * Get a cached date-time formatter for the supplied pattern and locale. + * + * @param dateFormat date-time pattern + * @param locale locale used to resolve the pattern + * @return cached formatter + */ + public static DateTimeFormatter getCacheDateTimeFormat(String dateFormat, Locale locale) { Locale actualLocale = locale == null ? Locale.getDefault(Locale.Category.FORMAT) : locale; Map> localeCache = DATE_TIME_FORMATTER_THREAD_LOCAL.get(); if (localeCache == null) { diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java index 0b7362698..f507861c5 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java @@ -17,12 +17,6 @@ * under the License. */ -/* - * This file is part of the Apache Fesod (Incubating) project, which was derived from Alibaba EasyExcel. - * - * Copyright (C) 2018-2024 Alibaba Group Holding Ltd. - */ - package org.apache.fesod.sheet.converter; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -42,6 +36,7 @@ import org.apache.fesod.sheet.metadata.property.DateTimeFormatProperty; import org.apache.fesod.sheet.metadata.property.ExcelContentProperty; import org.apache.fesod.sheet.testkit.Tags; +import org.apache.fesod.sheet.util.DateUtils; import org.apache.poi.ss.usermodel.DateUtil; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -58,6 +53,19 @@ void dateConverterDropsZoneWhilePreservingLocalDateTime() throws Exception { assertEquals(VALUE.toLocalDateTime(), result.getDateValue()); } + @Test + void dateConverterUsesDefaultFormatForEmptyPattern() throws Exception { + ZonedDateTimeDateConverter converter = new ZonedDateTimeDateConverter(); + ExcelContentProperty property = new ExcelContentProperty(); + property.setDateTimeFormatProperty(new DateTimeFormatProperty("", false)); + + WriteCellData result = converter.convertToExcelData(VALUE, property, new GlobalConfiguration()); + + assertEquals( + DateUtils.defaultDateFormat, + result.getWriteCellStyle().getDataFormatData().getFormat()); + } + @Test void numberConverterDropsZoneWhilePreservingLocalDateTime() { ZonedDateTimeNumberConverter converter = new ZonedDateTimeNumberConverter(); From ce0704e8b2db6542c20261b1cd59b1cf1fc82360 Mon Sep 17 00:00:00 2001 From: Alex Smolya Date: Thu, 17 Sep 2026 20:40:48 +0200 Subject: [PATCH 6/7] refactor(date): add ZonedDateTime DateUtils helpers --- .../ZonedDateTimeStringConverter.java | 29 ++++--------- .../apache/fesod/sheet/util/DateUtils.java | 42 ++++++++++++++++++- .../fesod/sheet/util/DateUtilsTest.java | 10 +++++ 3 files changed, 59 insertions(+), 22 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java index 9d3bc6198..2b1b2d77c 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeStringConverter.java @@ -19,13 +19,7 @@ package org.apache.fesod.sheet.converters.zoneddatetime; -import java.time.LocalDateTime; -import java.time.ZoneId; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.Locale; -import org.apache.fesod.common.util.StringUtils; import org.apache.fesod.sheet.converters.Converter; import org.apache.fesod.sheet.enums.CellDataTypeEnum; import org.apache.fesod.sheet.metadata.GlobalConfiguration; @@ -49,28 +43,21 @@ public CellDataTypeEnum supportExcelTypeKey() { @Override public ZonedDateTime convertToJavaData( ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - DateTimeFormatter formatter = formatter(contentProperty, globalConfiguration.getLocale()); - try { - return ZonedDateTime.parse(cellData.getStringValue(), formatter); - } catch (DateTimeParseException e) { - return LocalDateTime.parse(cellData.getStringValue(), formatter).atZone(ZoneId.systemDefault()); - } + return DateUtils.parseZonedDateTime( + cellData.getStringValue(), dateTimeFormat(contentProperty), globalConfiguration.getLocale()); } @Override public WriteCellData convertToExcelData( ZonedDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - return new WriteCellData<>(value.format(formatter(contentProperty, globalConfiguration.getLocale()))); + return new WriteCellData<>( + DateUtils.format(value, dateTimeFormat(contentProperty), globalConfiguration.getLocale())); } - private DateTimeFormatter formatter(ExcelContentProperty contentProperty, Locale locale) { - if (contentProperty == null - || contentProperty.getDateTimeFormatProperty() == null - || StringUtils.isEmpty( - contentProperty.getDateTimeFormatProperty().getFormat())) { - return DateTimeFormatter.ISO_ZONED_DATE_TIME; + private String dateTimeFormat(ExcelContentProperty contentProperty) { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return null; } - return DateUtils.getCacheDateTimeFormat( - contentProperty.getDateTimeFormatProperty().getFormat(), locale); + return contentProperty.getDateTimeFormatProperty().getFormat(); } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java index 85df9fafc..ce0e08d07 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/util/DateUtils.java @@ -32,7 +32,10 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -164,6 +167,25 @@ public static LocalTime parseLocalTime(String timeString, String timeFormat, Loc return LocalTime.parse(timeString, getCacheDateTimeFormat(timeFormat, local)); } + /** + * Convert string to a zoned date-time. + * + * @param dateTimeString + * @param dateTimeFormat + * @param local + * @return + */ + public static ZonedDateTime parseZonedDateTime(String dateTimeString, String dateTimeFormat, Locale local) { + DateTimeFormatter formatter = StringUtils.isEmpty(dateTimeFormat) + ? DateTimeFormatter.ISO_ZONED_DATE_TIME + : getCacheDateTimeFormat(dateTimeFormat, local); + try { + return ZonedDateTime.parse(dateTimeString, formatter); + } catch (DateTimeParseException e) { + return LocalDateTime.parse(dateTimeString, formatter).atZone(ZoneId.systemDefault()); + } + } + /** * convert string to date * @@ -328,6 +350,24 @@ public static String format(LocalTime time, String timeFormat, Locale local) { return time.format(getCacheDateTimeFormat(timeFormat, local)); } + /** + * Format a zoned date-time. + * + * @param dateTime + * @param dateTimeFormat + * @param local + * @return format string + */ + public static String format(ZonedDateTime dateTime, String dateTimeFormat, Locale local) { + if (dateTime == null) { + return null; + } + DateTimeFormatter formatter = StringUtils.isEmpty(dateTimeFormat) + ? DateTimeFormatter.ISO_ZONED_DATE_TIME + : getCacheDateTimeFormat(dateTimeFormat, local); + return dateTime.format(formatter); + } + /** * Format date * @@ -382,7 +422,7 @@ public static boolean isDate1904(ExcelContentProperty contentProperty, GlobalCon * @param locale locale used to resolve the pattern * @return cached formatter */ - public static DateTimeFormatter getCacheDateTimeFormat(String dateFormat, Locale locale) { + private static DateTimeFormatter getCacheDateTimeFormat(String dateFormat, Locale locale) { Locale actualLocale = locale == null ? Locale.getDefault(Locale.Category.FORMAT) : locale; Map> localeCache = DATE_TIME_FORMATTER_THREAD_LOCAL.get(); if (localeCache == null) { diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/DateUtilsTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/DateUtilsTest.java index a31454da7..a938179b1 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/DateUtilsTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/util/DateUtilsTest.java @@ -26,6 +26,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; @@ -231,6 +232,15 @@ void test_format_LocalTime() { Assertions.assertNull(DateUtils.format((LocalTime) null, DateUtils.TIME_FORMAT_8, Locale.US)); } + @Test + void test_parseAndFormat_ZonedDateTime() { + ZonedDateTime dateTime = ZonedDateTime.parse("2026-07-13T12:30:45+02:00[Europe/Stockholm]"); + + Assertions.assertEquals(dateTime, DateUtils.parseZonedDateTime(dateTime.toString(), null, Locale.US)); + Assertions.assertEquals("2026-07-13 12:30:45", DateUtils.format(dateTime, DateUtils.DATE_FORMAT_19, Locale.US)); + Assertions.assertNull(DateUtils.format((ZonedDateTime) null, DateUtils.DATE_FORMAT_19, Locale.US)); + } + @Test @ResourceLock(Resources.LOCALE) void test_dateTimeFormatterCache_distinguishesRootFromDefaultLocale() { From a957e84f737a1c2b964e76f5928dd5ff63e95618 Mon Sep 17 00:00:00 2001 From: Alex Smolya Date: Fri, 18 Sep 2026 18:30:39 +0200 Subject: [PATCH 7/7] fix(converter): reuse date windowing helper --- .../ZonedDateTimeNumberConverter.java | 16 +++---- .../converter/ZonedDateTimeConverterTest.java | 43 +++++++++---------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java index 9debf7c95..914324618 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/converters/zoneddatetime/ZonedDateTimeNumberConverter.java @@ -46,22 +46,16 @@ public CellDataTypeEnum supportExcelTypeKey() { @Override public ZonedDateTime convertToJavaData( ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - boolean use1904windowing = globalConfiguration.getUse1904windowing(); - if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { - use1904windowing = contentProperty.getDateTimeFormatProperty().getUse1904windowing(); - } - return DateUtils.getLocalDateTime(cellData.getNumberValue().doubleValue(), use1904windowing) + return DateUtils.getLocalDateTime( + cellData.getNumberValue().doubleValue(), + DateUtils.isDate1904(contentProperty, globalConfiguration)) .atZone(ZoneId.systemDefault()); } @Override public WriteCellData convertToExcelData( ZonedDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { - boolean use1904windowing = globalConfiguration.getUse1904windowing(); - if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { - use1904windowing = contentProperty.getDateTimeFormatProperty().getUse1904windowing(); - } - return new WriteCellData<>( - BigDecimal.valueOf(DateUtil.getExcelDate(value.toLocalDateTime(), use1904windowing))); + return new WriteCellData<>(BigDecimal.valueOf(DateUtil.getExcelDate( + value.toLocalDateTime(), DateUtils.isDate1904(contentProperty, globalConfiguration)))); } } diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java index f507861c5..4650883bf 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/converter/ZonedDateTimeConverterTest.java @@ -19,8 +19,6 @@ package org.apache.fesod.sheet.converter; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; import java.math.BigDecimal; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -38,6 +36,7 @@ import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.util.DateUtils; import org.apache.poi.ss.usermodel.DateUtil; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -49,8 +48,8 @@ class ZonedDateTimeConverterTest { void dateConverterDropsZoneWhilePreservingLocalDateTime() throws Exception { WriteCellData result = new ZonedDateTimeDateConverter().convertToExcelData(VALUE, null, new GlobalConfiguration()); - assertEquals(CellDataTypeEnum.DATE, result.getType()); - assertEquals(VALUE.toLocalDateTime(), result.getDateValue()); + Assertions.assertEquals(CellDataTypeEnum.DATE, result.getType()); + Assertions.assertEquals(VALUE.toLocalDateTime(), result.getDateValue()); } @Test @@ -61,7 +60,7 @@ void dateConverterUsesDefaultFormatForEmptyPattern() throws Exception { WriteCellData result = converter.convertToExcelData(VALUE, property, new GlobalConfiguration()); - assertEquals( + Assertions.assertEquals( DateUtils.defaultDateFormat, result.getWriteCellStyle().getDataFormatData().getFormat()); } @@ -73,8 +72,8 @@ void numberConverterDropsZoneWhilePreservingLocalDateTime() { WriteCellData written = converter.convertToExcelData(VALUE, null, globalConfiguration); ZonedDateTime read = converter.convertToJavaData(new ReadCellData<>(written.getNumberValue()), null, globalConfiguration); - assertEquals(VALUE.toLocalDateTime(), read.toLocalDateTime()); - assertEquals(ZoneId.systemDefault(), read.getZone()); + Assertions.assertEquals(VALUE.toLocalDateTime(), read.toLocalDateTime()); + Assertions.assertEquals(ZoneId.systemDefault(), read.getZone()); } @Test @@ -89,35 +88,35 @@ void numberConverterSupports1904Windowing() { WriteCellData written1900 = converter.convertToExcelData(VALUE, null, global1900); WriteCellData written1904 = converter.convertToExcelData(VALUE, null, global1904); - assertEquals( + Assertions.assertEquals( BigDecimal.valueOf(DateUtil.getExcelDate(VALUE.toLocalDateTime(), false)), written1900.getNumberValue()); - assertEquals( + Assertions.assertEquals( BigDecimal.valueOf(DateUtil.getExcelDate(VALUE.toLocalDateTime(), true)), written1904.getNumberValue()); - assertNotEquals(written1900.getNumberValue(), written1904.getNumberValue()); + Assertions.assertNotEquals(written1900.getNumberValue(), written1904.getNumberValue()); ZonedDateTime read1904 = converter.convertToJavaData(new ReadCellData<>(written1904.getNumberValue()), null, global1904); - assertEquals(VALUE.toLocalDateTime(), read1904.toLocalDateTime()); - assertEquals(ZoneId.systemDefault(), read1904.getZone()); + Assertions.assertEquals(VALUE.toLocalDateTime(), read1904.toLocalDateTime()); + Assertions.assertEquals(ZoneId.systemDefault(), read1904.getZone()); ZonedDateTime read1904With1900 = converter.convertToJavaData(new ReadCellData<>(written1904.getNumberValue()), null, global1900); - assertNotEquals(VALUE.toLocalDateTime(), read1904With1900.toLocalDateTime()); + Assertions.assertNotEquals(VALUE.toLocalDateTime(), read1904With1900.toLocalDateTime()); // 2. Configured via ExcelContentProperty ExcelContentProperty property1904 = new ExcelContentProperty(); property1904.setDateTimeFormatProperty(new DateTimeFormatProperty("yyyy-MM-dd HH:mm:ss", true)); WriteCellData writtenProperty1904 = converter.convertToExcelData(VALUE, property1904, global1900); - assertEquals( + Assertions.assertEquals( BigDecimal.valueOf(DateUtil.getExcelDate(VALUE.toLocalDateTime(), true)), writtenProperty1904.getNumberValue()); ZonedDateTime readProperty1904 = converter.convertToJavaData( new ReadCellData<>(writtenProperty1904.getNumberValue()), property1904, global1900); - assertEquals(VALUE.toLocalDateTime(), readProperty1904.toLocalDateTime()); - assertEquals(ZoneId.systemDefault(), readProperty1904.getZone()); + Assertions.assertEquals(VALUE.toLocalDateTime(), readProperty1904.toLocalDateTime()); + Assertions.assertEquals(ZoneId.systemDefault(), readProperty1904.getZone()); } @Test @@ -125,7 +124,7 @@ void stringConverterPreservesZoneInIsoText() throws Exception { ZonedDateTimeStringConverter converter = new ZonedDateTimeStringConverter(); GlobalConfiguration globalConfiguration = new GlobalConfiguration(); WriteCellData written = converter.convertToExcelData(VALUE, null, globalConfiguration); - assertEquals( + Assertions.assertEquals( VALUE, converter.convertToJavaData(new ReadCellData<>(written.getStringValue()), null, globalConfiguration)); } @@ -136,7 +135,7 @@ void stringConverterUsesConfiguredPattern() throws Exception { ExcelContentProperty property = new ExcelContentProperty(); property.setDateTimeFormatProperty(new DateTimeFormatProperty("yyyy-MM-dd HH:mm:ss Z", false)); GlobalConfiguration globalConfiguration = new GlobalConfiguration(); - assertEquals( + Assertions.assertEquals( "2020-01-02 03:04:05 +0000", converter .convertToExcelData(VALUE, property, globalConfiguration) @@ -151,7 +150,7 @@ void stringConverterWithEmptyOrNullPatternFallsBackToIso() throws Exception { ExcelContentProperty emptyProperty = new ExcelContentProperty(); emptyProperty.setDateTimeFormatProperty(new DateTimeFormatProperty("", false)); WriteCellData writtenEmpty = converter.convertToExcelData(VALUE, emptyProperty, globalConfiguration); - assertEquals( + Assertions.assertEquals( VALUE, converter.convertToJavaData( new ReadCellData<>(writtenEmpty.getStringValue()), emptyProperty, globalConfiguration)); @@ -160,7 +159,7 @@ void stringConverterWithEmptyOrNullPatternFallsBackToIso() throws Exception { nullFormatProperty.setDateTimeFormatProperty(new DateTimeFormatProperty(null, false)); WriteCellData writtenNullFormat = converter.convertToExcelData(VALUE, nullFormatProperty, globalConfiguration); - assertEquals( + Assertions.assertEquals( VALUE, converter.convertToJavaData( new ReadCellData<>(writtenNullFormat.getStringValue()), @@ -170,12 +169,12 @@ void stringConverterWithEmptyOrNullPatternFallsBackToIso() throws Exception { @Test void convertersAreRegisteredForSupportedDirections() { - assertEquals( + Assertions.assertEquals( ZonedDateTimeDateConverter.class, DefaultConverterLoader.loadDefaultWriteConverter() .get(ConverterKeyBuild.buildKey(ZonedDateTime.class)) .getClass()); - assertEquals( + Assertions.assertEquals( 2, DefaultConverterLoader.loadAllConverter().entrySet().stream() .filter(entry -> entry.getKey().getClazz() == ZonedDateTime.class)