Skip to content

Add support for Instant and Date in DateTime scalar #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/main/java/graphql/scalars/datetime/DateTimeScalar.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@
import graphql.schema.GraphQLScalarType;

import java.time.DateTimeException;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;
import java.util.function.Function;

import static graphql.scalars.util.Kit.typeName;
Expand All @@ -35,6 +38,10 @@ public String serialize(Object input) throws CoercingSerializeException {
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 Date) {
offsetDateTime = ((Date) input).toInstant().atOffset(ZoneOffset.UTC);
} else if (input instanceof String) {
offsetDateTime = parseOffsetDateTime(input.toString(), CoercingSerializeException::new);
} else {
Expand All @@ -58,6 +65,10 @@ public OffsetDateTime parseValue(Object input) throws CoercingParseValueExceptio
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 Date) {
offsetDateTime = ((Date) input).toInstant().atOffset(ZoneOffset.UTC);
} else if (input instanceof String) {
offsetDateTime = parseOffsetDateTime(input.toString(), CoercingParseValueException::new);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import graphql.schema.CoercingSerializeException
import spock.lang.Specification
import spock.lang.Unroll

import static graphql.scalars.util.TestKit.mkDate
import static graphql.scalars.util.TestKit.mkInstant
import static graphql.scalars.util.TestKit.mkLocalDT
import static graphql.scalars.util.TestKit.mkOffsetDT
import static graphql.scalars.util.TestKit.mkStringValue
Expand All @@ -30,6 +32,8 @@ class DateTimeScalarTest extends Specification {
"1937-01-01T12:00:27.87+00:20" | mkOffsetDT("1937-01-01T12:00:27.87+00:20")
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:09Z")
mkDate(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09Z")
}

@Unroll
Expand All @@ -46,6 +50,8 @@ class DateTimeScalarTest extends Specification {
"1937-01-01T12:00:27.87+00:20" | mkStringValue("1937-01-01T12:00:27.87+00:20")
mkOffsetDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09+10:00")
mkZonedDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09+10:00")
mkInstant(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09Z")
mkDate(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09Z")
}

@Unroll
Expand Down Expand Up @@ -86,6 +92,8 @@ class DateTimeScalarTest extends Specification {
"1937-01-01T12:00:27.87+00:20" | "1937-01-01T12:00:27.87+00:20"
mkOffsetDT(year: 1980, hour: 3) | "1980-08-08T03:10:09+10:00"
mkZonedDT(year: 1980, hour: 3) | "1980-08-08T03:10:09+10:00"
mkInstant(year: 1980, hour: 3) | "1980-08-08T03:10:09Z"
mkDate(year: 1980, hour: 3) | "1980-08-08T03:10:09Z"
}

def "datetime serialisation bad inputs"() {
Expand Down
10 changes: 10 additions & 0 deletions src/test/groovy/graphql/scalars/util/TestKit.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import graphql.language.FloatValue
import graphql.language.IntValue
import graphql.language.StringValue

import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime
Expand Down Expand Up @@ -50,6 +51,15 @@ 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 Date mkDate(args) {
Date.from(mkInstant(args))
}


static assertValueOrException(result, expectedResult) {
if (result instanceof Exception) {
Expand Down