Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set GrapqQL date format

I have a mongoDB database in which one field is an ISO date. When i query the table using a graphql (node) query i receive my objects back all right but the date format i see in graphiql is in this weird format:

"created": "Sun Nov 26 2017 00:55:35 GMT+0100 (CET)"

if i write the field out in my resolver is shows:

2017-11-25T23:55:35.116Z

How do i change the date format so it will show ISO dates in graphiql?

the field is just declared as a string in my data type.

EDIT My simple type is defined as:

type MyString {
  _id: String
  myString: String
  created: String
}

When I insert a value into the base created is set automatically by MongoDB.

When I run the query it returns an array of obejcts. In my resolver (for checking) I do the following:

 getStrings: async (_, args) => {
        let myStrings = await MyString.find({});
        for (var i = 0; i < myStrings.length; i++) {
            console.log(myStrings[i]["created"]);
        }

    return myStrings;
}

all objects created date in the returned array have the form:

2017-11-25T23:55:35.116Z

but when i see it in GraphIql it shows as:

"created": "Sun Nov 26 2017 00:55:35 GMT+0100 (CET)"

my question is: Why does it change format?

Since my model defines this as a String it should not be manipulated but just retain the format. But it doesn't. It puzzels me.

Kim

like image 306
Kim Gabrielsen Avatar asked Jan 03 '23 03:01

Kim Gabrielsen


1 Answers

In your resolver, just return a formatted string using toISOString()

const date1 = new Date('2017-11-25T23:45:35.116Z').toISOString();
console.log({date1});
// => { date1: '2017-11-25T23:45:35.116Z' }

const date2 = new Date('Sun Nov 26 2017 00:55:35 GMT+0100 (CET)').toISOString();
console.log({date2})
// => { date2: '2017-11-25T23:55:35.000Z' }

UPDATED to answer the added question, "Why does [the date string] change format"?

Mongo does not store the date as a string. It stores the date as a Unix epoch (aka Unix time, aka POSIX time), which is the number of seconds that have elapsed since January 1, 1970 not counting leap seconds (in ISO 8601: 1970-01-01T00:00:00Z). Since your data model requests a string, it'll coerce the value using toString()

const date1 = new Date('2017-11-25T23:45:35.116Z').toString();
console.log({date1})
// => { date1: 'Sat Nov 25 2017 15:45:35 GMT-0800 (PST)' }

That should clarify the behavior for you, but what you probably really want to do is change your model so that created is properly typed as a Date. You can do this a couple ways.

  1. Create a custom scalar
  • GraphQLScalarType
  • Creating custom scalar types
  1. Or use an existing package that already does the above for you
  • graphql-date
  • graphql-iso-date
like image 177
Chris Geirman Avatar answered Jan 14 '23 08:01

Chris Geirman