From 1e99e7d38b8090b1cc4dc5e42b5375917eeb5a81 Mon Sep 17 00:00:00 2001 From: Yama Safi <145813473+yamatsafi@users.noreply.github.com> Date: Fri, 22 Sep 2023 18:42:58 -0500 Subject: [PATCH 1/9] Update DateTime.ts The DateTime scalar (GraphQLDateTime) fails to convert any 10-digit unix timestamp, for example, 1695416400, produces a date like 1970-01-20T14:56:56.400Z. In javascript, if one tries to convert a UNIX timestamp into a human-readable date, one must do: const humanReadableDate = new Date(1695416400 * 1000).toISOString(); // result 2023-09-22T21:00:00.000Z --- src/scalars/iso-date/DateTime.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scalars/iso-date/DateTime.ts b/src/scalars/iso-date/DateTime.ts index 2779df420..6af5a1175 100644 --- a/src/scalars/iso-date/DateTime.ts +++ b/src/scalars/iso-date/DateTime.ts @@ -33,7 +33,7 @@ export const GraphQLDateTimeConfig: GraphQLScalarTypeConfig = /*#__P throw createGraphQLError(`DateTime cannot represent an invalid date-time-string ${value}.`); } else if (typeof value === 'number') { try { - return new Date(value); + return new Date(value * 1000).toISOString(); } catch (e) { throw createGraphQLError('DateTime cannot represent an invalid Unix timestamp ' + value); } From b25f6da8300efc25e75c63480b3b67db5be98a79 Mon Sep 17 00:00:00 2001 From: Yama Safi <145813473+yamatsafi@users.noreply.github.com> Date: Sat, 23 Sep 2023 23:11:27 -0500 Subject: [PATCH 2/9] Update DateTime.test.ts --- tests/iso-date/DateTime.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/iso-date/DateTime.test.ts b/tests/iso-date/DateTime.test.ts index 8157e56c9..6f6869af1 100644 --- a/tests/iso-date/DateTime.test.ts +++ b/tests/iso-date/DateTime.test.ts @@ -86,12 +86,12 @@ describe('GraphQLDateTime', () => { // Serializes Unix timestamp [ - [854325678000, '1997-01-27T00:41:18.000Z'], - [876535000, '1970-01-11T03:28:55.000Z'], + [854325678, '1997-01-27T00:41:18.000Z'], + [866478, '1970-01-11T03:28:55.000Z'], // The maximum representable unix timestamp - [2147483647000, '2038-01-19T03:14:07.000Z'], + [2147483647, '2038-01-19T03:14:07.000Z'], // The minimum representable unit timestamp - [-2147483648000, '1901-12-13T20:45:52.000Z'], + [-2147483648, '1901-12-13T20:45:52.000Z'], ].forEach(([value, expected]) => { it(`serializes unix timestamp ${stringify(value)} into date-string ${expected}`, () => { expect(GraphQLDateTime.serialize(value).toJSON()).toEqual(expected); From 9ebe318851dd66b47195439bc7844554228b4c87 Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Sun, 24 Sep 2023 11:53:24 -0500 Subject: [PATCH 3/9] fix: remove converting datetime into iso string --- src/scalars/iso-date/DateTime.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scalars/iso-date/DateTime.ts b/src/scalars/iso-date/DateTime.ts index 6af5a1175..2149dc215 100644 --- a/src/scalars/iso-date/DateTime.ts +++ b/src/scalars/iso-date/DateTime.ts @@ -33,7 +33,7 @@ export const GraphQLDateTimeConfig: GraphQLScalarTypeConfig = /*#__P throw createGraphQLError(`DateTime cannot represent an invalid date-time-string ${value}.`); } else if (typeof value === 'number') { try { - return new Date(value * 1000).toISOString(); + return new Date(value * 1000); } catch (e) { throw createGraphQLError('DateTime cannot represent an invalid Unix timestamp ' + value); } From cac243ae43feea00078c6e65f1e2705ed6def4ce Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Mon, 25 Sep 2023 09:38:43 -0500 Subject: [PATCH 4/9] fix: Update DateTime.test.ts --- tests/iso-date/DateTime.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/iso-date/DateTime.test.ts b/tests/iso-date/DateTime.test.ts index 6f6869af1..7ccfee090 100644 --- a/tests/iso-date/DateTime.test.ts +++ b/tests/iso-date/DateTime.test.ts @@ -87,7 +87,7 @@ describe('GraphQLDateTime', () => { // Serializes Unix timestamp [ [854325678, '1997-01-27T00:41:18.000Z'], - [866478, '1970-01-11T03:28:55.000Z'], + [866478, '1970-01-11T00:41:18.000Z'], // The maximum representable unix timestamp [2147483647, '2038-01-19T03:14:07.000Z'], // The minimum representable unit timestamp From 53462c48537a1ba1f49434ef478665cf3b910e7c Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Mon, 25 Sep 2023 09:41:22 -0500 Subject: [PATCH 5/9] fix: Update DateTime.integration.test.ts --- tests/iso-date/DateTime.integration.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/iso-date/DateTime.integration.test.ts b/tests/iso-date/DateTime.integration.test.ts index 6e73208d0..08520645f 100644 --- a/tests/iso-date/DateTime.integration.test.ts +++ b/tests/iso-date/DateTime.integration.test.ts @@ -28,7 +28,7 @@ const schema = new GraphQLSchema({ }, validUnixTimestamp: { type: GraphQLDateTime, - resolve: () => 854325678000, + resolve: () => 854325678, }, invalidDateString: { type: GraphQLDateTime, From 46db48828afe8ec8cc5c4aa42491eef066e310b1 Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Tue, 24 Oct 2023 17:53:17 -0500 Subject: [PATCH 6/9] feat: add support for handling unix timestamps in seconds --- src/scalars/iso-date/DateTime.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/scalars/iso-date/DateTime.ts b/src/scalars/iso-date/DateTime.ts index 2149dc215..60b007aa8 100644 --- a/src/scalars/iso-date/DateTime.ts +++ b/src/scalars/iso-date/DateTime.ts @@ -33,7 +33,14 @@ export const GraphQLDateTimeConfig: GraphQLScalarTypeConfig = /*#__P throw createGraphQLError(`DateTime cannot represent an invalid date-time-string ${value}.`); } else if (typeof value === 'number') { try { - return new Date(value * 1000); + // Find out if the value is in seconds or milliseconds + const dateInMilliseconds = Date.now(); + if (dateInMilliseconds.toString().length === value.toString().length) { + return new Date(value); + } else { + // Convert to milliseconds + return new Date(value * 1000); + } } catch (e) { throw createGraphQLError('DateTime cannot represent an invalid Unix timestamp ' + value); } From 1b31c93b438a24fde2e0262aa7b8699bc11fc557 Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:10:29 -0500 Subject: [PATCH 7/9] Update DateTime.ts --- src/scalars/iso-date/DateTime.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/scalars/iso-date/DateTime.ts b/src/scalars/iso-date/DateTime.ts index 60b007aa8..98fdddbea 100644 --- a/src/scalars/iso-date/DateTime.ts +++ b/src/scalars/iso-date/DateTime.ts @@ -33,9 +33,11 @@ export const GraphQLDateTimeConfig: GraphQLScalarTypeConfig = /*#__P throw createGraphQLError(`DateTime cannot represent an invalid date-time-string ${value}.`); } else if (typeof value === 'number') { try { - // Find out if the value is in seconds or milliseconds - const dateInMilliseconds = Date.now(); - if (dateInMilliseconds.toString().length === value.toString().length) { + // This should support 13 and 12-digit timestamps + if ( + (value <= 9999999999999 && value.toString().length === 13) || + (value <= 999999999999 && value.toString().length === 12) + ) { return new Date(value); } else { // Convert to milliseconds From 00ed44b4a0f84498e732ecbbbacd5148c4335e3d Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:12:36 -0500 Subject: [PATCH 8/9] Update DateTime.integration.test.ts --- tests/iso-date/DateTime.integration.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/iso-date/DateTime.integration.test.ts b/tests/iso-date/DateTime.integration.test.ts index 08520645f..a365c0058 100644 --- a/tests/iso-date/DateTime.integration.test.ts +++ b/tests/iso-date/DateTime.integration.test.ts @@ -30,6 +30,10 @@ const schema = new GraphQLSchema({ type: GraphQLDateTime, resolve: () => 854325678, }, + validUnixTimestamp: { + type: GraphQLDateTime, + resolve: () => 854325678000, + }, invalidDateString: { type: GraphQLDateTime, resolve: () => '2017-01-001T00:00:00Z', From 7a116adb20998a13d54a4bf370a837303fb7d228 Mon Sep 17 00:00:00 2001 From: Yama S <145813473+yamatsafi@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:14:29 -0500 Subject: [PATCH 9/9] Update DateTime.test.ts --- tests/iso-date/DateTime.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/iso-date/DateTime.test.ts b/tests/iso-date/DateTime.test.ts index 7ccfee090..dbe6938ce 100644 --- a/tests/iso-date/DateTime.test.ts +++ b/tests/iso-date/DateTime.test.ts @@ -86,9 +86,14 @@ describe('GraphQLDateTime', () => { // Serializes Unix timestamp [ + [854325678000, '1997-01-27T00:41:18.000Z'], [854325678, '1997-01-27T00:41:18.000Z'], [866478, '1970-01-11T00:41:18.000Z'], - // The maximum representable unix timestamp + [1713305032000, '2024-04-16T22:03:52.000Z'], + [1713305032, '2024-04-16T22:03:52.000Z'], + // The maximum representable unix timestamp in milliseconds + [2147483647000, '2038-01-19T03:14:07.000Z'], + // The maximum representable unix timestamp in seconds [2147483647, '2038-01-19T03:14:07.000Z'], // The minimum representable unit timestamp [-2147483648, '1901-12-13T20:45:52.000Z'],