Mongoose 中的东 8 区时间解决方案

阅读时长 3 分钟读完

前言

在前后端分离的开发模式下,对时间的处理可谓是一个永恒的话题。而对于多国家多地区的开发,时区问题也十分重要。而在处理 MongoDB 数据库时,我们通常会使用 Mongoose ORM。但是,Mongoose 中对于时间的处理却有许多坑点,这里就为大家分享一些 Mongoose 中的东 8 区时间解决方案。

问题描述

在使用 Mongoose 存储时间类型的数据时,我们通常会向数据库插入 Date 类型的对象。但是由于 MongoDB 会将时间转换为 UTC 时间,即格林威治标准时间,而我们在中国大陆处于东 8 区,所以在 Mongoose 中将中国标准时间转换成 UTC 时间时需要注意一些细节。

问题分析

在进行时间存储时,由于 UTC 时间与中国标准时间相差 8 小时,因此我们需要将 JavaScript 中的中国标准时间转换成 UTC 时间。但是,这里需要注意的是,JavaScript 中的 Date 对象保存的时间戳是自 UTC 时间 1970 年 1 月 1 日 00:00:00 起的毫秒数。因此,在使用 new Date() 构造函数时,需要将中国标准时间减去 8 小时,否则转换后的时间将与预期不符。

解决方案

1. 方法一

我们可以通过以下代码将中国标准时间转换成 UTC 时间:

这里需要注意的是,由于 utcTime 的类型为 Date 对象,因此在存储到 MongoDB 中时需要使用 toJSON() 方法将其转换成字符串类型的 UTC 时间再存储。

2. 方法二

为了简化转换过程,我们也可以在 Mongoose 的模型中添加一个虚拟属性 localTime,来获取本地时间(也就是中国标准时间)。

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

这里我们使用 createTime 来代替实际使用的时间字段,这是因为在 MongoDB 中,时间查询只支持 Date 类型的字段。同时,在 toJSONtoObject 中设置 virtuals 属性,以便在查询结果中显示虚拟属性。在这里,我们可以使用以下方法进行查询:

总结

在 Mongoose 中,处理东 8 区时间问题可谓是一道比较大的坑点。通过上述两种解决方案,我们可以对 Mongoose 中的时间存储有更深入的了解,同时,也可以更好地应对不同地区时间问题的处理。

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

纠错
反馈