【发布时间】:2020-04-10 06:27:32
【问题描述】:
我收到来自 Stripe API GET /invoices 端点的响应,该端点将日期作为 unix 时间戳返回。一个示例值为 1573917475。我需要将此值保存为 Mongoose 中的 ISO 格式。示例:2019-11-16T15:17:55 我熟悉如何使用 Javascript 或 MomentJS 将此值转换为 ISO / UTC 格式的日期时间值。但是,如果可能,我想在 Mongoose Schema 中设置此行为。
包含时间戳值的 API 响应:
{
"period_end": 1576509475,
"period_start": 1573917475
}
Mongoose 架构:
new Schema({
... redacted ...
period_end: { type: Date },
period_start: { type: Date },
... redacted ...
});
这目前在 Mongo 中保存为日期,其值如下:
{
"period_end": "1970-01-19T04:34:23.671+0000"
}
当年份是 1970 年时,这通常是因为输入日期格式存在问题。这种类型的转换可以在模式级别执行吗?
我看到这个 Mongoose 文档 https://mongoosejs.com/docs/tutorials/dates.html 提到在保存到架构之前转换值。但我不希望手动循环遍历这些值,因为我正在保存来自 API 的原始响应。
编辑:使用@ambianBeing 提供的答案,我想出了以下解决方案。
new Schema({
... redacted ...
period_end: { type: Date, set: d => convertSecsToMs(d) },
period_start: { type: Date, set: d => convertSecsToMs(d) },
... redacted ...
});
function convertSecsToMs(d) {
if (!d || !isValidTimestamp(d)) return;
return new Date(d * 1000);
}
function isValidTimestamp(date) {
return new Date(date).getTime() > 0;
}
【问题讨论】:
-
UNIX 时间戳以秒为单位; JavaScript 以毫秒为单位工作。您必须将该时间戳值乘以 1000。
-
是的,我可以手动进行转换。我的问题更多的是,这可以在模式中完成吗?
标签: javascript node.js mongodb mongoose stripe-payments