diff --git a/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/main/java/org/activiti/api/runtime/model/impl/StringToDateConverter.java b/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/main/java/org/activiti/api/runtime/model/impl/StringToDateConverter.java index b1d263181cf0b54be133ae0d514740e462fdecf2..9c7d715ba31f6479cab3dcb9d8c2bee992709f60 100644 --- a/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/main/java/org/activiti/api/runtime/model/impl/StringToDateConverter.java +++ b/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/main/java/org/activiti/api/runtime/model/impl/StringToDateConverter.java @@ -17,7 +17,10 @@ package org.activiti.api.runtime.model.impl; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Date; import java.util.TimeZone; @@ -26,18 +29,12 @@ import org.springframework.core.convert.converter.Converter; @ProcessVariableTypeConverter public class StringToDateConverter implements Converter { - private static SimpleDateFormat ISO_DATE_TIME = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); - - static { - ISO_DATE_TIME.setTimeZone(TimeZone.getTimeZone("UTC")); - } - @Override public Date convert(String source) { - try { - return ISO_DATE_TIME.parse(source); - } catch (ParseException e) { - throw new RuntimeException(e); + if (source.endsWith("Z")) { + return Date.from(Instant.parse(source)); + } else { + return Date.from(OffsetDateTime.parse(source).toInstant()); } } } diff --git a/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/test/java/org/activiti/api/runtime/model/impl/StringToDateConverterTest.java b/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/test/java/org/activiti/api/runtime/model/impl/StringToDateConverterTest.java index 2973bb084f3d4950a191c395497f24c575268bee..72bec28c56184bf64b0fa6cba6f24d43aa4e7d4f 100644 --- a/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/test/java/org/activiti/api/runtime/model/impl/StringToDateConverterTest.java +++ b/activiti-core/activiti-api-impl/activiti-api-process-model-impl/src/test/java/org/activiti/api/runtime/model/impl/StringToDateConverterTest.java @@ -17,38 +17,39 @@ package org.activiti.api.runtime.model.impl; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import java.time.Instant; import java.util.Date; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; class StringToDateConverterTest { - private StringToDateConverter subject = new StringToDateConverter(); - - @Test - void convertISODateTimeUTC() { - //given - String source = "2022-01-17T00:00:00.000Z"; + private static Instant example = Instant.parse("2022-01-17T00:00:00Z"); - //when - Date result = subject.convert(source); - - //then - assertThat(result).isEqualTo(Instant.parse(source)); + private static Stream arguments() { + return Stream.of( + Arguments.of("2022-01-17T00:00:00.000Z", example), + Arguments.of("2022-01-17T00:00:00Z", example), + Arguments.of("2022-01-17T00:00:00.000-00:00", example), + Arguments.of("2022-01-17T00:00:00-00:00", example) + ); } - @Test - void convertISODateTimeOffset() { - //given - String source = "2022-01-17T00:00:00.000-00:00"; + private StringToDateConverter subject = new StringToDateConverter(); + @ParameterizedTest + @MethodSource("arguments") + public void convert(String source, Instant expected) { //when Date result = subject.convert(source); //then - assertThat(result).isEqualTo(Date.from(Instant.parse("2022-01-17T00:00:00.000Z"))); + assertThat(result.toInstant()).isEqualTo(expected); } }