在 GraphQL 中处理现实世界中的时间和日期

阅读时长 9 分钟读完

GraphQL 是一种用于 API 的查询语言,它使得客户端能够只请求所需的数据,从而减少了无用的数据传输。然而,在 GraphQL 中处理现实世界中的时间和日期可能会有一些挑战,特别是在不同的时区和语言环境中。

本文将向大家介绍如何在 GraphQL 中处理时间和日期,包括如何在 GraphQL schema 中定义和解析日期和时间类型、如何使用标准格式化和解析库来处理时间和日期、如何支持时区和语言环境,以及如何处理夏令时等问题。

定义和解析日期和时间类型

在 GraphQL schema 中定义日期和时间类型是很容易的。通常我们会使用标准的 ISO 格式(例如:YYYY-MM-DDTHH:mm:ss.sssZ)来表示日期和时间。以下是一个例子:

-- -------------------- ---- -------
------ ----

---- ----- -
  --- ---
  ------ -------
  --------- -------
  ----- -----
-

---- ----- -
  ------- ---------
-

这里我们定义了一个 Date 标量类型,并将其用于 Event 中的 date 字段。然后我们可以在 resolver 中使用标准的 JavaScript Date 对象来解析和格式化日期。

以下是一个示例 resolver:

-- -------------------- ---- -------
----- --------- - -
  ----- --- -------------------
    ----- -------
    ---------- ------- -- --------------------
    ----------- ------- -- --- ------------
    ------------- ----- -- -------- --- ----------- - --- --------------- - -----
  ---
  ------ -
    ------- -- -- -
      ------ -
        -
          --- ----
          ------ -------- --------
          --------- ---- ---------- ----
          ----- --- ---------------------------------
        --
        -
          --- ----
          ------ ------ ------------
          --------- ---- ----- ----
          ----- --- ---------------------------------
        --
      --
    --
  --
--

在这个示例中,我们使用了名为 Date 的 GraphQLScalarType,并在其 serialize、parseValue 和 parseLiteral 方法中定义了如何解析和格式化日期。在 resolver 中,我们返回了两个事件,它们的日期都是标准的 ISO 格式。

使用标准格式化和解析库

尽管在 JavaScript 中使用 Date 对象处理日期和时间是很容易的,但处理时区和语言环境可能会有很多麻烦。为了避免这些麻烦,我们可以使用标准的格式化和解析库来处理日期和时间。

以下是一些流行的库:

  • date-fns:适用于现代 JavaScript 的现代日期库。
  • Moment.js:处理、解析和显示日期和时间的库。
  • Luxon:一个轻量级的现代日期库,可以使用类似于 Moment.js 的 API。

以下是一个使用 date-fns 的示例:

-- -------------------- ---- -------
------ - ---------- -------- - ---- -----------

----- --------- - -
  ----- --- -------------------
    ----- -------
    ---------- ------- -- -----------------
    ----------- ------- -- ----------------
    ------------- ----- -- -------- --- ----------- - ------------------- - -----
  ---
  ------ -
    ------- -- -- -
      ------ -
        -
          --- ----
          ------ -------- --------
          --------- ---- ---------- ----
          ----- -------------------------------------
        --
        -
          --- ----
          ------ ------ ------------
          --------- ---- ----- ----
          ----- -------------------------------------
        --
      --
    --
  --
--

在这个示例中,我们使用了 date-fns 的 formatISO 和 parseISO 函数来格式化和解析 ISO 格式的日期。我们也可以使用其他函数来处理时区和语言环境。

支持时区和语言环境

在现实世界中,多个国家和地区使用不同的时区和语言环境,因此在处理日期和时间时,我们需要支持这些差异。一种常见的方法是存储日期和时间的 UTC 格式,并在客户端或服务端中将其转换为所需的时区和语言环境。

以下是一个使用 moment.js 和 moment-timezone 的示例:

-- -------------------- ---- -------
------ ------ ---- ------------------

----- --------- - -
  ----- --- -------------------
    ----- -------
    ---------- ------- - -------- -- -- ------------------------------------
    ----------- ------- -- -----------------------
    ------------- ----- -- -------- --- ----------- - -------------------------- - -----
  ---
  ------ -
    ------- -- -- -
      ------ -
        -
          --- ----
          ------ -------- --------
          --------- ---- ---------- ----
          ----- --- ---------------------------------
        --
        -
          --- ----
          ------ ------ ------------
          --------- ---- ----- ----
          ----- --- ---------------------------------
        --
      --
    --
  --
--

在这个示例中,我们使用了 moment-timezone 库中的 tz 函数来处理时区。我们还将时区作为 GraphQL resolver 的参数传递。在客户端中,我们可以使用同样的方式来处理时区和语言环境。

处理夏令时等问题

在处理日期和时间时,还需要考虑夏令时等问题。夏令时是一种用于节省日光的措施,但它使得时区在某些时间发生变化。在这种情况下,我们需要使用可靠的库来处理日期和时间。

以下是一个使用 moment-timezone 和 date-fns 的示例:

-- -------------------- ---- -------
------ ------ ---- ------------------
------ - ---------- -------- - ---- -----------

----- --------- - -
  ----- --- -------------------
    ----- -------
    ---------- ------- - -------- -- --
      ---------------- ------------------------
    ----------- ------- -- -----------------------
    ------------- ----- -- -------- --- ----------- - -------------------------- - -----
  ---
  ------ -
    ------- -- -- -
      ----- ------ - -
        -
          --- ----
          ------ -------- --------
          --------- ---- ---------- ----
          ----- -------------------------------------
        --
        -
          --- ----
          ------ ------ ------------
          --------- ---- ----- ----
          ----- -------------------------------------
        --
      --

      ------ ------------------ -- -
        ----- ------- - --------------------- -------
        ----- ------- - ----------------------------------
        ----- ------------- - ----------------------------

        ------ - --------- ----- ------------- --
      ---
    --
  --
--

在这个示例中,我们使用了 moment-timezone 库中的 tz 函数来处理时区和夏令时问题,并使用了 date-fns 库中的格式化函数来格式化日期。我们还将日期表示为 UTC 时间,并将其转换为本地时间。最后,我们处理了夏令时问题,并返回了格式化好的日期。

总结

在 GraphQL 中处理日期和时间可能会有一些挑战,但我们可以使用标准的格式化和解析库来解决这些问题。为了支持多个时区和语言环境,我们可能需要将日期表示为 UTC 时间,并在客户端或服务端中将其转换为所需的时区和语言环境。在处理夏令时等问题时,我们需要使用可靠的库来处理日期和时间。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64808cb948841e9894fff173

纠错
反馈