【问题标题】:set GrapqQL date format设置 GrapqQL 日期格式
【发布时间】:2018-05-09 13:46:07
【问题描述】:

我有一个 mongoDB 数据库,其中一个字段是 ISO 日期。 当我使用 graphql(节点)查询查询表时,我收到了我的对象,但我在 graphiql 中看到的日期格式是这种奇怪的格式:

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

如果我在解析器中写出该字段,则显示:

2017-11-25T23:55:35.116Z

如何更改日期格式,以便在 graphiql 中显示 ISO 日期?

该字段只是在我的数据类型中声明为字符串。

编辑 我的简单类型定义为:

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

当我将值插入到创建的基础时,MongoDB 会自动设置。

当我运行查询时,它会返回一个对象数组。在我的解析器(用于检查)中,我执行以下操作:

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

    return myStrings;
}

返回数组中创建日期的所有对象都具有以下形式:

2017-11-25T23:55:35.116Z

但是当我在 GraphIql 中看到它时,它显示为:

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

我的问题是:为什么会改变格式?

由于我的模型将其定义为字符串,因此不应对其进行操作,而应保留格式。但事实并非如此。这让我很困惑。

【问题讨论】:

    标签: node.js mongodb date graphql


    【解决方案1】:

    你只需要一步一步做:

    1. 您的字段的设置类型是对象
    2. 将行 scalar Object 插入到您的 .graphql 文件中
    3. 将依赖graphql-java-extended-scalars添加到pom.xml文件中
    4. 在 buildRuntimeWiring 函数中添加语法 .scalar(ExtendedScalars.Object)

    让我们试试。 我试了一下,成功了!

    【讨论】:

      【解决方案2】:

      在您的解析器中,只需使用 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' }
      

      已更新以回答添加的问题“为什么 [日期字符串] 更改格式”?

      Mongo 不会将日期存储为字符串。它将日期存储为 Unix 纪元(又名 Unix 时间,又名 POSIX 时间),这是自 1970 年 1 月 1 日 以来经过的秒数,不包括闰秒(在 ISO 8601 中:1970- 01-01T00:00:00Z)。由于您的数据模型请求一个字符串,因此它将使用 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)' }
      

      这应该为您阐明行为,但您可能真正想要做的是更改您的模型,以便将created 正确键入为Date。您可以通过多种方式做到这一点。

      1. 创建自定义标量
      1. 或使用已经为您完成上述操作的现有软件包

      【讨论】:

      • 感谢您抽出宝贵时间帮助我。我稍微编辑了我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2015-01-13
      • 1970-01-01
      • 2020-07-01
      相关资源
      最近更新 更多