Mongoose Schema TimeZone

关於 时区

因为取资料的方式都以时间线的方式取得(http, websocket)

所以时区是一个必须要解决的问题

在 Mongodb 中 Date 储存的是 Int

没有办法在 Storage 层中解决时区问题

所以在储存的时候都统一使用 UTC

所以在处理时区问题可以在 getter/setter 中解决

以getter 做范例

const DEFAULT_TIME_ZONE = 'Asia/Taipei';
const DEFAULT_FORMAT_DATE_TIME = 'yyyy-MM-dd HH:mm:ss.SSS';

const schemaOptions = {
  toObject: {
    getters: true,
    virtuals: true,
    versionKey: false,
    transform: function(doc, ret) {
      ret.id = ret._id;
      delete ret._id;
    }
  },
  toJSON: {
    getters: true,
    virtuals: true,
    versionKey: false,
    transform: function(doc, ret) {
      ret.id = ret._id;
      delete ret._id;
    }
  },
  runSettersOnQuery: true,
};

const formatDateTime = (date) =>
  format(utcToZonedTime(date, DEFAULT_TIME_ZONE), DEFAULT_FORMAT_DATE_TIME);


const messageSchema = new Schema({
  createAt: {
    type: Date,
    default: now,
    get: formatDateTime,
  },
}, schemaOptions);

这样取值的时候会自动将 UTC 转为 Asiz/Taipei 的时区时间

再顺便处理 format

而在 schemaOptions 中部只处理 getter/setter

同时将 _id => id 做处理

参考资料

UTC与 GTM


<<:  【零基础成为 AI 解梦大师秘笈】Day28 - 周易解梦之人工智慧(9)

>>:  DAY28 - EDM切版

DAY12-JAVA的类别(6)-变数和函数

实例变数 实例变数(instance variable)拥有储存资料成员的记忆体空间,不与其他物件共...

[Day5]-串列的相关用法

字串 函数应用方法 len() – 字串长度 min() – 最小值 max() – 最大值 使用...

Day 0x10 - 整理解密函数与 Webhook api

0x1 前言 昨天确认接到讯息回覆了,今天来把解密函数跟 receive_msg 整理一下 0x2 ...

[ Day 16 ] - 事件

事件 指的是在 DOM 上所发生的事件,换句话是可以是特定的动作被触发後,必须要执行对应的事情。 (...

git - 3 ( remote、git pull = git fetch + git merge )

1. 远端数据库 - git remote 如何推送分支到远端数据库 (1) 建立新专案并连接本地数...