【问题标题】:Date Validation in NodejsNodejs 中的日期验证
【发布时间】:2013-06-30 06:51:55
【问题描述】:

我希望用户输入他的出生日期。我希望它采用 YYYY-MM-DD 格式。 Node-Validator 现在验证所有日期格式,而不是特定格式。所以如果我输入 12324433 ,它也会被验证,因为它认为它的纪元时间。

请帮我看看我该怎么办? 这个问题特定于 Mongoose 中的验证

【问题讨论】:

标签: javascript node.js validation date mongoose


【解决方案1】:

我是express-form 的忠实粉丝,def 值得一看——你也可以使用moment.js。出于这个原因,我自己使用它

来自 moment.js 文档:

moment("2011-10-10", "YYYY-MM-DD").isValid(); // true
moment("2011-10-50", "YYYY-MM-DD").isValid(); // false (bad day of month)

干杯,我希望这会有所帮助:)

ps - moment.js github url 以防万一。

【讨论】:

  • 像大卫一样,我发现这一任务非常方便。它确实很好地处理了这些任务。
  • 注意:它不是用来验证输入字符串是否匹配格式字符串。由于格式匹配的严格程度会因应用程序和业务需求而异,因此 Moment.js 中不包含此类验证。这是在文档本身。你还认为我应该使用他们的验证方法吗?而不是上面提到的正则表达式?
  • 我认为他们只是要小心并确保您正在清理您的时间戳-我不会只需要时间来验证他们,我只会像下面那样做一个正则表达式如果是为了这个专有用例。干杯!
  • 我已经解决了,右边是moment(value,'DD-MM-GGGG',true).isValid()
  • @evilMinion 对不起,我现在使用 date-fns,没有更多的时间,管理日期和格式很复杂
【解决方案2】:

正如 Node-Validator 的文档所指出的,“正则表达式可能是更好的选择”。 我创建了一个看起来不错的正则表达式,我相信它可以完成工作,但如果你打算使用它,我建议你彻底测试它。

/\d\d\d\d-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\d|3[0-1])/

此正则表达式将验证您需要的 YYYY-MM-DD 格式的日期。 您可以在此处看到使用它的工作代码 sn-p: http://tinker.io/c269b/

祝你好运!

编辑: 我注意到有什么东西破坏了它。此正则表达式验证部分匹配,因此“1970-01-011”之类的输入检查为有效。发生这种情况是因为我忘记在正则表达式中添加 startend 标记。这是我修复后的样子:

/^\d\d\d\d-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\d|3[0-1])$/

Tinker 上的示例也通过修复更新。

【讨论】:

  • 感谢您的回答。需要对它进行多彻底的测试?
  • 我不确定,我只是尝试了一些我能想到的不同输入,仅此而已。我知道它可以很好地处理从 01 到 12 的月份和从 01 到 31 的日子。试着看看你是否能想出其他可能会破坏它的东西。
  • 对不起你的方法不适合之前我可以调用猫鼬验证方法,猫鼬已将字符串转换为日期对象。即使它是一个整数,它也会将其视为纪元时间并进行转换。请检查更新的问题(对猫鼬验证进行了编辑)
  • 我不确定我是否理解您的意思。如果该值作为来自 mongoose 的 Date 对象返回,您如何验证它以确定原始用户输入是否有效?听起来您应该在序列的较早部分验证用户输入,最好是在刚刚提交用户输入并且您的服务器开始处理它时。
【解决方案3】:

由于我也在研究这个问题并且也在检查 express 验证器,所以我还模拟了一个正则表达式,它可能会帮助你验证日期。

((19|2\d)\d\d)-((0?[1-9])|(1[0-2]))-((0?[1-9])|([12]\d)|(3[01]))

这是解释它的图像:

【讨论】:

    【解决方案4】:
    //let pdateFormat = "YYYYMMDDHHmmss";
    //let pdateStr = "20210228005959";
    
    let pdateFormat = 'YYYYMMDDHH:mm';
    let pdateStr = '2021022823:59';
    

    validateDateFormat(pdateFormat, pdateStr);

    function validateDateFormat(dateFormat, dateStr) {
      if (dateFormat.length != dateStr.length) {
        return false;
      }
    
      let dateIdentifierArr = {
        year: 'YYYY',
        month: 'MM',
        date: 'DD',
        hour: 'HH',
        minute: 'mm',
        second: 'ss',
      };
    
      let dateConstructVar = {};
      for (var key in dateIdentifierArr) {
        if (dateFormat.indexOf(dateIdentifierArr[key]) != -1) {
          let index = dateFormat.indexOf(dateIdentifierArr[key]);
          dateConstructVar[key] = dateStr.substring(
            index,
            index + dateIdentifierArr[key].length
          );
        } else {
          dateConstructVar[key] = '00';
        }
      }
    
      let newDate = new Date(
        +dateConstructVar['year'],
        dateConstructVar['month'] - 1,
        +dateConstructVar['date'],
        dateConstructVar['hour'],
        dateConstructVar['minute'],
        dateConstructVar['second']
      );
      if (
        dateConstructVar['year'] != newDate.getFullYear() ||
        dateConstructVar['month'] != ('0' + (newDate.getMonth() + 1)).slice(-2) ||
        dateConstructVar['date'] != ('0' + newDate.getDate()).slice(-2) ||
        dateConstructVar['hour'] != ('0' + newDate.getHours()).slice(-2) ||
        dateConstructVar['minute'] != ('0' + newDate.getMinutes()).slice(-2) ||
        dateConstructVar['second'] != ('0' + newDate.getSeconds()).slice(-2)
      ) {
        console.log('Invalid Date');
      }
    
      console.log(newDate);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2017-01-25
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多