【问题标题】:Compare Dates In Mongoose Doc and Express Current Date比较 Mongoose Doc 和 Express 当前日期中的日期
【发布时间】:2019-04-19 01:02:36
【问题描述】:

我正在查找提交 POST 请求的用户,然后查看他们是否在他们尝试提交的同一架构中拥有文档。如果他们有多个,我会排序并返回最近的一个。我想将当前日期与 mongoose 文档中找到的日期进行比较,看看他们在过去 30 天内是否执行了相同的操作,如果是,请阻止他们执行上述操作。

尝试了多种谷歌搜索解决方案/stackoverflow/reddit 想法,但没有得到我想要的。

在我的 Express POST 请求中

let currentDate = new Date();
console.log(currentDate);
User.findOne({
    user: req.user.id
  })
  .then(user => {
      Scores.find().sort({
          date: -1
        }).limit(1)
        .select('date')
        .then(date => {
            if (currentDate - date <= 30) {
              res.json({
                toosoon: 'You are attempting to do this action too many times in one month'
              })
            })
        })
  })

如果用户在我的收藏中有一个文档的日期小于或等于上次提交后的 30 天,则阻止用户提交发布请求。

【问题讨论】:

  • 尝试使用{ unique: true }
  • 这不是只检查该用户的其他文档是否存在吗?我不想阻止他们提交多个文件。我想查看他们最近提交的一份是否至少在 30 天前提交。

标签: javascript express mongoose


【解决方案1】:

这是一个简单的 JS 日期操作,您可以在代码中使用它。

let date = new Date();

console.log('Today is: ' + date.toLocaleString());

date.setDate(date.getDate() - 30);

console.log('30 days ago was: ' + date.toLocaleString());

但是,我强烈建议您使用 moment.js library
您可以在此处获得有关如何使用它的完整说明,包括。例子:

Moment.js 入门:

Moment.js 可从项目的homepage 免费下载。 Moment.js 可以从浏览器以及Node.js 应用程序中运行。为了在 Node 中使用它,请使用以下命令安装模块。

npm install moment 然后,只需 require() 并在您的应用程序中使用它,如下所示。

const moment = require('moment');

moment().format();

为了从浏览器运行 Moment,请下载脚本并使用脚本标签包含它,如下例所示。 Moment.js 创建了一个全局 moment 对象,可用于访问所有日期和时间解析和操作功能。

***日期格式****


在过去,我记得将日期字符串转换为 Date 对象,获取单个数据,然后执行字符串连接。 Moment.js 简化了将日期转换为任何特定格式的过程。使用 Moment 转换日期格式很简单,如下例所示。

moment().format('YYYY MM DD');

moment() 给出当前日期和时间,而format() 将当前日期和时间转换为指定格式。此示例将日期格式化为四位数的年份、后跟一个空格、后跟两位数的月份、另一个空格和一个两位数的日期。您可以通过查看此演示来查看此代码的运行情况。

日期验证


Moment.js 简化的另一个烦人的任务是日期验证。为了执行验证,只需将日期字符串连同日期格式一起传递给 moment 对象,然后调用 isValid() 方法。如果日期有效,此方法返回 true,否则返回 false。下面显示了一个示例,以及随附的演示。

let dateEntered = $('#txtEnteredDate').val();

if (!moment(dateEntered,'MM-DD-YYYY').isValid()) {
  console.log('Invalid Date');
} else {
  console.log('Valid Date');
}

moment() 返回的对象中还有许多其他有用的标志:

overflow – 这是在发生溢出时设置的。例如,第 13 个月或第 32 天。

*invalidMonth* – Set when the month is invalid, like Jannnuaarry.
*empty* – Set when the entered date contains nothing parsable.
*nullInput* – Set when the entered date is null.

操纵日期


有许多用于操作矩对象的选项。例如,您可以添加或减去天、月、年等。这是通过add()subtract() 方法实现的。以下示例显示了如何将 7 天、几个月或几周添加到当前日期。

moment().add('days', 7);    // adds 7 days to current date
moment().add('months', 7);  // adds 7 months to current date
moment().add('years', 7);   // adds 7 years to current date

同样,subtract() 方法如下所示。

moment().subtract('days', 7);   // subtracts 7 days to current date
moment().subtract('months', 7); // subtracts 7 months to current date
moment().subtract('years', 7);  // subtracts 7 years to current date

现在的时间


另一个常见任务是确定两个日期之间存在多少时间。对于从当前日期计算时间,Moment.js 使用名为fromNow() 的方法。这是一个检查从当前时间开始存在多少时间的示例:

moment().fromNow();

此代码示例显示“几秒钟前”。如果我们为时刻对象提供日期,它将根据差异显示从现在开始的时间范围。例如,以下代码显示“7 天前”。

const dateA = moment().subtract('days', 7);

dateA.fromNow();

从另一个日期开始的时间 fromNow() 用于将时间与当前日期进行比较。这只是from() 的一个特例,它比较两个任意日期。下面显示了一个使用 from() 的示例。此代码显示“在一天内”。您可以通过查看此演示来查看此代码的运行情况。

const dateB = moment('2019-12-12');
const dateC = moment('2019-12-11');
console.log(dateB.from(dateC));

计算日期之间的差异


Moment.js 提供了一种计算两个日期之间差异的方法。默认情况下以毫秒为单位计算差异,但也可以以天、月、年等形式返回。要计算差异,请调用 diff() 方法。此方法将日期作为其第一个参数。可以使用可选的第二个参数指定时间单位。如果这不包括在内,则使用毫秒。以下示例和演示说明了如何使用 diff()

const dateB = moment('2019-11-11');
const dateC = moment('2019-10-11');

console.log('差是', dateB.diff(dateC), '毫秒'); console.log('区别是', dateB.diff(dateC, 'days'), 'days'); console.log('差是', dateB.diff(dateC, 'months'), 'months');

日期查询

Moment.js还提供日期比较方法。这些方法是isBefore()isAfter()isSame()。顾名思义,这些方法返回一个布尔值,指示一个日期是在另一个日期之前、之后还是等于另一个日期。使用 isAfter() 的示例如下所示。

console.log(moment('2010-09-20').isAfter('2010-10-19')); // returns false
console.log(moment('2010-11-20').isAfter('2010-10-19')); // returns true

还有一个isLeapYear() 方法可以检查闰年。 我还建议查看calendar() 方法,尤其是针对您的情况;)

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2013-01-04
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多