This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/struts.git


The following commit(s) were added to refs/heads/main by this push:
     new 9861b834a add conversion handling for OffsetDateTime (#1241)
9861b834a is described below

commit 9861b834abab25f1a0c914fd381f15a3691383d3
Author: bill-humblcloud <bill@humbl.cloud>
AuthorDate: Thu Mar 6 00:48:52 2025 -0500

    add conversion handling for OffsetDateTime (#1241)
---
 .../java/org/apache/struts2/conversion/impl/DateConverter.java   | 9 +++++++++
 .../org/apache/struts2/conversion/impl/XWorkBasicConverter.java  | 3 +++
 .../org/apache/struts2/conversion/impl/XWorkConverterTest.java   | 8 ++++++++
 3 files changed, 20 insertions(+)

diff --git 
a/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java 
b/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java
index 753e72766..037ca032f 100644
--- a/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java
+++ b/core/src/main/java/org/apache/struts2/conversion/impl/DateConverter.java
@@ -33,6 +33,7 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.TemporalAccessor;
@@ -116,6 +117,14 @@ public class DateConverter extends DefaultTypeConverter {
                     throw new TypeConversionException("Could not parse date", 
e);
                 }
 
+            } else if (OffsetDateTime.class == toType) {
+                DateTimeFormatter dtf = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+
+                try {
+                    return OffsetDateTime.parse(sa, dtf);
+                } catch (DateTimeParseException e) {
+                    throw new TypeConversionException("Could not parse 
OffsetDateTime", e);
+                }
             }
 
             // final fallback for dates without time
diff --git 
a/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java
 
b/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java
index 281e36380..a19ae2068 100644
--- 
a/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java
+++ 
b/core/src/main/java/org/apache/struts2/conversion/impl/XWorkBasicConverter.java
@@ -28,6 +28,7 @@ import java.lang.reflect.Member;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.OffsetDateTime;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
@@ -108,6 +109,8 @@ public class XWorkBasicConverter extends 
DefaultTypeConverter {
             result = doConvertToDate(context, value, toType);
         } else if (LocalTime.class.isAssignableFrom(toType)) {
             result = doConvertToDate(context, value, toType);
+        } else if (OffsetDateTime.class.isAssignableFrom(toType)) {
+            result = doConvertToDate(context, value, toType);
         } else if (Calendar.class.isAssignableFrom(toType)) {
             result = doConvertToCalendar(context, value);
         } else if (Collection.class.isAssignableFrom(toType)) {
diff --git 
a/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java 
b/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java
index 256d9b231..39fe8e2cf 100644
--- 
a/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java
+++ 
b/core/src/test/java/org/apache/struts2/conversion/impl/XWorkConverterTest.java
@@ -54,6 +54,7 @@ import java.time.format.DateTimeFormatter;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.OffsetDateTime;
 import java.util.Date;
 import java.util.Set;
 
@@ -115,9 +116,13 @@ public class XWorkConverterTest extends XWorkTestCase {
         DateTimeFormatter formatterTime = 
DateTimeFormatter.ofPattern("HH:mm:ss");
         LocalTime localTime = LocalTime.parse("10:11:12", formatterTime);
 
+        DateTimeFormatter formatterOffsetDateTime = 
DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+        OffsetDateTime offsetDateTime = 
OffsetDateTime.parse("2001-01-10T10:11:12+05:00", formatterOffsetDateTime);
+
         String localDateStr = (String) converter.convertValue(context, null, 
null, null, localDate, String.class);
         String localDateTimeStr = (String) converter.convertValue(context, 
null, null, null, localDateTime, String.class);
         String localTimeStr = (String) converter.convertValue(context, null, 
null, null, localTime, String.class);
+        String offsetDateTimeStr = (String) converter.convertValue(context, 
null, null, null, offsetDateTime, String.class);
 
         LocalDate localDate2 = (LocalDate) converter.convertValue(context, 
null, null, null, localDateStr, LocalDate.class);
         assertEquals(localDate, localDate2);
@@ -127,6 +132,9 @@ public class XWorkConverterTest extends XWorkTestCase {
 
         LocalTime localTime2 = (LocalTime) converter.convertValue(context, 
null, null, null, localTimeStr, LocalTime.class);
         assertEquals(localTime, localTime2);
+
+        OffsetDateTime offsetDateTime2 = (OffsetDateTime) 
converter.convertValue(context, null, null, null, offsetDateTimeStr, 
OffsetDateTime.class);
+        assertEquals(offsetDateTime, offsetDateTime2);
     }
 
     public void testDateConversionWithDefault() throws ParseException {

Reply via email to