首页 > 解决方案 > Mongoose 以 UTC 保存,但需要在不同时区检索取决于用户时区

问题描述

Mongoose 以 UTC 格式保存所有日期,这没关系。

每个用户都有一个特定的时区。它存储在用户的文档中。

我想将任何文档发送给客户,并在用户的时区转换日期。

我知道如何格式化一个值,但我正在寻找一种解决方案来避免逐个转换。

变通解决方案将是客户端上针对每个值或递归修改响应的传递转换函数。

有什么想法吗?

标签: expressdatetimemongoosetimezone

解决方案


您可以在聚合中执行此操作。

假设您有以下数据:

[
  {
    "_id": {
      "$oid": "5f18b5c87f9f9c0fd8322b60"
    },
    "createdAt": {
      "$date": "2020-07-22T21:55:20.575Z"
    },
    
  },
  {
    "_id": {
      "$oid": "5f19efac5cfa75483865eaa2"
    },
    "createdAt": {
      "$date": "2020-07-23T20:14:36.108Z"
    },
  }
]

你可以这样做:

const timezone = "America/Chicago"

Model.aggregate([
    {
        $set: {
            localTime: {
                $dateToString: {
                    date: "$createdAt",
                    timezone
                }
            }
        },
    }
]);

聚合的结果将是:

[
  {
    "_id": ObjectId("5f18b5c87f9f9c0fd8322b60"),
    "createdAt": ISODate("2020-07-22T21:55:20.575Z"),
    "localTime": "2020-07-22T16:55:20.575Z"
  },
  {
    "_id": ObjectId("5f19efac5cfa75483865eaa2"),
    "createdAt": ISODate("2020-07-23T20:14:36.108Z"),
    "localTime": "2020-07-23T15:14:36.108Z"
  }
]

演示示例:https ://mongoplayground.net/p/7IOGMrC2sf5


推荐阅读