使用 NodeJS 将 Unix Epoch 时间戳保存到 Mongoose Schema 类型 Date

Posted

技术标签:

【中文标题】使用 NodeJS 将 Unix Epoch 时间戳保存到 Mongoose Schema 类型 Date【英文标题】:Save Unix Epoch Timestamp to Mongoose Schema type Date using NodeJS 【发布时间】: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。 是的,我可以手动进行转换。我的问题更多的是,这可以在模式中完成吗? 【参考方案1】:

Mongoose 在架构级别支持setters/getters,可与更新操作一起使用。

const docSchema = new Schema(
  period_start: 
    type: Date,
    set: d => new Date(d * 1000)
  ,
  period_end: 
    type: Date,
    set: d => new Date(d * 1000)
  
);

【讨论】:

所以只要我使用选项 new: true, upsert: true, passRawResult: true 执行 findOneAndUpdate 就可以了。似乎运作良好。

以上是关于使用 NodeJS 将 Unix Epoch 时间戳保存到 Mongoose Schema 类型 Date的主要内容,如果未能解决你的问题,请参考以下文章

将Windows UTC时间转换为Unix epoch

在pyspark中将Unix(Epoch)时间更改为本地时间

Razor 视图中的 Epoch/Unix 时间戳(以毫秒为单位)到日期时间

提前 30 分钟获取 Android Unix Epoch?

ESP8266-通过NTP获取 Epoch/Unix(时间戳)时间

如何像这样(2019-11-12T10:26:39.613Z)将unix epoch datetimeformat保存到models.DateTimeField中