未验证 提交 59aa9b48 编写于 作者: I Igor Dianov 提交者: GitHub

fix: regression in string to date converter when parsing UTC date format (#3804)

* fix: regression in string to date converter when parsing UTC date format

* fix: refactor StringToDateConverterTest using ParameterizedTest
上级 2b040da9
......@@ -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<String, Date> {
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());
}
}
}
......@@ -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> 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);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册