diff --git a/src/main/java/graphql/scalars/datetime/DateTimeScalar.java b/src/main/java/graphql/scalars/datetime/DateTimeScalar.java index c920c13..41c8000 100644 --- a/src/main/java/graphql/scalars/datetime/DateTimeScalar.java +++ b/src/main/java/graphql/scalars/datetime/DateTimeScalar.java @@ -14,6 +14,8 @@ import java.time.DateTimeException; import java.time.OffsetDateTime; import java.time.ZonedDateTime; +import java.time.Instant; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; @@ -50,6 +52,8 @@ public String serialize(Object input, GraphQLContext graphQLContext, Locale loca offsetDateTime = (OffsetDateTime) input; } else if (input instanceof ZonedDateTime) { offsetDateTime = ((ZonedDateTime) input).toOffsetDateTime(); + } else if (input instanceof Instant){ + offsetDateTime = ((Instant) input).atOffset(ZoneOffset.UTC); } else if (input instanceof String) { offsetDateTime = parseOffsetDateTime(input.toString(), CoercingSerializeException::new); } else { @@ -73,6 +77,8 @@ public OffsetDateTime parseValue(Object input, GraphQLContext graphQLContext, Lo offsetDateTime = (OffsetDateTime) input; } else if (input instanceof ZonedDateTime) { offsetDateTime = ((ZonedDateTime) input).toOffsetDateTime(); + } else if (input instanceof Instant){ + offsetDateTime = ((Instant)input).atOffset(ZoneOffset.UTC); } else if (input instanceof String) { offsetDateTime = parseOffsetDateTime(input.toString(), CoercingParseValueException::new); } else { diff --git a/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy b/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy index d8cb915..6b7379b 100644 --- a/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy +++ b/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy @@ -8,6 +8,7 @@ import graphql.schema.CoercingParseValueException import graphql.schema.CoercingSerializeException import spock.lang.Unroll +import static graphql.scalars.util.TestKit.mkInstant import static graphql.scalars.util.TestKit.mkIntValue import static graphql.scalars.util.TestKit.mkLocalDT import static graphql.scalars.util.TestKit.mkOffsetDT @@ -33,6 +34,7 @@ class DateTimeScalarTest extends AbstractScalarTest { "2022-11-24T01:00:01.02+00:00" | mkOffsetDT("2022-11-24T01:00:01.02+00:00") mkOffsetDT(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09+10:00") mkZonedDT(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09+10:00") + mkInstant(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09.00Z") } @Unroll @@ -51,6 +53,7 @@ class DateTimeScalarTest extends AbstractScalarTest { "2022-11-24T01:00:01.02+00:00" | mkStringValue("2022-11-24T01:00:01.020Z") mkOffsetDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09.000+10:00") mkZonedDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09.000+10:00") + mkInstant(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09.000Z") } @Unroll @@ -97,6 +100,7 @@ class DateTimeScalarTest extends AbstractScalarTest { "2022-11-24T01:00:01.02+00:00" | "2022-11-24T01:00:01.020Z" mkOffsetDT(year: 1980, hour: 3) | "1980-08-08T03:10:09.000+10:00" mkZonedDT(year: 1980, hour: 3) | "1980-08-08T03:10:09.000+10:00" + mkInstant(year: 1980, hour: 3) | "1980-08-08T03:10:09.000Z" } def "datetime serialisation bad inputs"() { diff --git a/src/test/groovy/graphql/scalars/util/TestKit.groovy b/src/test/groovy/graphql/scalars/util/TestKit.groovy index 27aafdd..4eca04a 100644 --- a/src/test/groovy/graphql/scalars/util/TestKit.groovy +++ b/src/test/groovy/graphql/scalars/util/TestKit.groovy @@ -7,6 +7,7 @@ import graphql.scalars.country.code.CountryCode import java.awt.* import java.time.Duration +import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime import java.time.LocalTime @@ -54,6 +55,11 @@ class TestKit { args.min ?: 10, args.secs ?: 9, args.nanos ?: 0, ZoneId.ofOffset("", ZoneOffset.ofHours(10))) } + static Instant mkInstant(args) { + OffsetDateTime.of(args.year ?: 1969, args.month ?: 8, args.day ?: 8, args.hour ?: 11, + args.min ?: 10, args.secs ?: 9, args.nanos ?: 0, ZoneOffset.UTC).toInstant() + } + static Duration mkDuration(String s) { Duration.parse(s) }