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