【问题标题】:Add month to current date in mongoose schema's default date value在猫鼬模式默认日期值中将月份添加到当前日期
【发布时间】:2018-06-03 02:19:32
【问题描述】:

我们有一个像这样的猫鼬模式:

var sampleSchema = new Schema({
    fieldABC: String,
    expireAfter1Month:{
        type: Date,
        default: new Date() + 1 month
    }
});

expireAfter1Month的默认值应设置为一个月后的日期值。

我有这些:

如何在猫鼬模式的默认日期值中将月份添加到当前日期?

也许我能做到

default: +new Date() + 30*24*60*60*1000

但是,我想知道是否有更好/优化的方法?

【问题讨论】:

  • 看到第二个链接的接受答案了吗?改用timeObject.setMonth(timeObject.getMonth() + 1);??可能?不用担心溢出...在 12 月的日期中添加一个月将导致在 1 月的日期...当然...如果您在 1 月 31 日添加一个月 - 这将导致 3 月 2 日,是这就是你想要的?
  • @JaromandaX 将对此进行测试并告知。如果是 1 月 31 日,我需要 3 月 2 日

标签: javascript node.js mongodb date mongoose


【解决方案1】:

基于您发布的链接之一的答案

https://stackoverflow.com/a/30525690/5053002

var minuteFromNow = function(){
    var timeObject = new Date();
    timeObject.setTime(timeObject.getTime() + 1000 * 60);
    return timeObject;
};

new Schema({
    date: { type: Date, default: minuteFromNow }
})

例如,如果您希望从 1 月 29 日/30 日/31 日起的一个月都为 2 月 28 日(当然是闰年的 29 日),而从 3 月 31 日、5 月、8 月或 10 月起的一个月都为 4 月 30 日,分别是 6 月、9 月和 11 月,那么你需要更多的逻辑

类似

function oneMonthFromNow() {
    var d = new Date();
    var targetMonth = d.getMonth() + 1;
    d.setMonth(targetMonth);
    if(d.getMonth() !== targetMonth % 12) {
        d.setDate(0); // last day of previous month
    }
    return d;
}
new Schema({
    date: { type: Date, default: oneMonthFromNow}
})

为了说明如何处理月末,以下是相同的代码,除了 d 是传入的任意日期,而不是使用 now - 来说明这将如何工作

function oneMonthFromNow(d) {
    var targetMonth = d.getMonth() + 1;
    d.setMonth(targetMonth);
    if(d.getMonth() !== targetMonth % 12) {
        d.setDate(0); // last day of previous month
    }
    return d;
}
console.log(oneMonthFromNow(new Date('2017-10-31T00:00:00Z'))); // 30 November
console.log(oneMonthFromNow(new Date('2017-11-30T00:00:00Z'))); // 30 December
console.log(oneMonthFromNow(new Date('2017-12-31T00:00:00Z'))); // 31 January
console.log(oneMonthFromNow(new Date('2018-01-31T00:00:00Z'))); // 28 February
console.log(oneMonthFromNow(new Date('2018-02-28T00:00:00Z'))); // 28 March

您的评论(在我发布此答案后添加:p)建议从 1 月 31 日开始的一个月应该是 3 月 2 日,即始终只添加 30 天,在这种情况下您自己的建议

new Schema({
    date: { type: Date, default: +new Date() + 30*24*60*60*1000}
})

会很理想

【讨论】:

  • 约会问题经常得不到很好的回答,看到一个好的问题是一个令人愉快的变化。 :-)
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
相关资源
最近更新 更多