【问题标题】:Issue in setting mongo ttl based on timezone基于时区设置 mongo ttl 的问题
【发布时间】:2020-07-14 11:14:21
【问题描述】:

目前我正在第二天开始清除 mongodb 中的数据。 IE; 2020 年 7 月 15 日 00:00:00 根据时间从数据库中删除数据。在这里,我正在努力将适当的时间分配给 mongodb 的 expiresAt 属性。下面是我试图设置为 mongodb 的代码

 const dateToString  = new Date().toLocaleString("en-US", { timeZone: "Europe/Helsinki" });
 const date = new Date(dateToString);
 date.setDate(date.getDate());
 date.setHours(0);
 date.setMinutes(0);
 date.setSeconds(0);
 date.setMilliseconds(0);

下面的代码,我用来设置ttl:

this.connector.update(COLLECTION_NAME,
                                 { _id: id },
                                 { $set: { amount, expiresAt: date } },
                                 { upsert: true });

如果使用上述代码,它将设置到期时间为 15-07-2020 00:00:00。要求是 mongodb 必须在第二天的芬兰时间 12:00 自动清除文档。但由于服务器以 UTC 时间运行, 这没有按预期工作。我没有明白我的意思。

有人可以帮我找到相同的解决方案吗?准备使用 moment 或 javascript Date 属性。

【问题讨论】:

  • @Joe 服务器在 UTC 时间运行,例如;如果我创建了文档,则必须在明天开始清除文档,时区是欧洲/赫尔辛基。因此,当我检查 12.00 时钟芬兰时间时,必须清除数据。
  • mongodb中的所有日期时间对象都存储为UTC。
  • @Joe 是的,你能更新一下我们可以实现时间的方式吗?因为如果我将 12:00:00 设置为 mongodb,在芬兰时间凌晨 3 点,数据将被清除。如果我错了,请纠正我。
  • 是的,这是正确的,所以将过期时间设置为 UTC 晚上 9 点
  • @Joe 如果可能的话,你能不能更新一下代码,这可能会有很大的帮助。也会很乐意使用时刻。另外,如果我们有夏令时,这会是个问题吗?

标签: javascript node.js mongodb date


【解决方案1】:

赫尔辛基的当前偏移量(EEST-夏令时)是UTC +3,其中3 hours180 mins10,800 seconds在UTC之前。

以您正在执行 00:00:00 的方式存储 expiresAt,因为 mongo db 会将其存储在 UTC 中,即 3 小时后。

expiresAt 上创建 TTL 索引 10,800 秒后:

db.collection.createIndex( { "expiresAt": 1 }, { expireAfterSeconds: 10800 } );

【讨论】:

  • 这里的问题是如果我们在几秒钟后添加过期,那么假设我在早上创建文档,那么它将在 3 小时后过期..
  • @Vishnu Erm,考虑一下。如果您在早上创建文档,但您明确将 expiresAt 设置为午夜右 (00.00.00).. 所以 mongo 将在 3 小时前将其存储在 UTC 2020-07-15T21:00:00.000Z 中。然后文档将在此日期字段的 3 小时后过期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
相关资源
最近更新 更多