【问题标题】:How to test different format of dates in javascript / jquery?如何在 javascript / jquery 中测试不同格式的日期?
【发布时间】:2014-07-07 09:53:24
【问题描述】:

我正在开发一个应用程序。在这个应用程序中有一个输入字段。用户可以在其中输入不同格式的日期,例如

ddmmyy, ddmmyyyy, dd-mm-yy, mm-dd-yy

我需要验证日期是否有效。我可以通过这种方式进行验证:

YYYY-MM-DD 使用:

var myDate = new Date("1987-08-06") // 它返回有效的日期。

但我无法使用其他格式进行验证。我该如何验证?

示例:

var myDate = new Date("08-06-1987")..etc?

我使用 jQuery 开发了我的应用程序。我正在寻找一些不使用插件的解决方案。因为我已经使用了 no.of 插件。

提前致谢!

【问题讨论】:

  • 对日期使用两个输入。一种用于服务器上的存储,它始终采用YYYY-MM-DD 格式并隐藏。另一个用于向用户显示,其格式可以根据用户的需要进行格式化。要将用户格式转换为数据格式,请使用 Date.js。我知道你说没有插件,但是插件的数量不是问题,在 JS 中使用日期是一个巨大的痛苦,所以这个确实需要一个插件。
  • 你怎么知道它是哪种日期格式:01-02-14 ??? dd-mm-yy 还是 mm-dd-yy???
  • 我根据页面进行配置和验证,无论用户需要给我dd-mm-yy还是mm-dd-yy。所以我会相应地决定。

标签: javascript jquery validation date


【解决方案1】:

我会用正则表达式来做。您可以为每种格式定义一个正则表达式模式。然后您可以测试输入字段中的字符串是否与任何模式匹配。 是这样的:

var regExpDDMMYY = /[0-9]{2}[0-1][0-9][0-9]{2}/g;
var regExpddmmyyyy = ...;
...
...

if (regExpDDMMYY.test(yourInputStringFromDateField)) {
    // handleDateAs DDMMYY
} else if (regExpddmmyyyy .test(yourInputStringFromDateField)) {
    ...
} else {
    throw new YourException();
}

你可以在这里找到一个例子: http://www.w3schools.com/js/js_regexp.asp

【讨论】:

    【解决方案2】:

    不幸的是,原生 JS 中没有“parseExact”,这也是跨浏览器。所以你要么需要使用 Date.js 库,要么编写一些转换器。

    对于这项任务,我建议您使用“责任链”模式

    function DateTimeParser() {
       this.parse = function (input) {
          for (var key in Parsers) {
              var result = Parsers[key].parse(input);
              if (result !== null)
                 return result;
          }
          return null;
       };
       this.parseExact = function (input, format) {
          var parser = Parsers[format];
          return parser ? parser.parse(input) : null;
       };
    
       var ConcreteDateTimeParser = function (expression, parser) {
           this.parse = function (input) {
               if (!input.match(expression))
                   return null;
               var result = parser(input);
               return isNaN(result.getDate()) ? null : result;
           };
       };
    
       var Parsers = {
           "dd-mm-yyyy": new ConcreteDateTimeParser(/\d{2}\-\d{2}\-\d{4}/, function (input) {
               var dd = parseInt(input.slice(0, 2)),
                   mm = parseInt(input.slice(3, 5)),
                   yyyy = parseInt(input.slice(-4));
               return new Date(yyyy, mm, dd);               
           }),
           "ddmmyyyy": new ConcreteDateTimeParser(/\d{8}/, function (input) {
               var dd = parseInt(input.slice(0, 2)),
                   mm = parseInt(input.slice(2, 4)),
                   yyyy = parseInt(input.slice(-4));
               return new Date(yyyy, mm, dd);
           })
       };
    };
    
    
    var instance = new DateTimeParser();
    instance.parse('22122012');
    instance.parseExact('22122012', 'ddmmyyyy');
    instance.parseExact('22122012', 'dd-mm-yyyy'); // null
    

    由此,您可以使用其他解析器扩展您的 Parsers 库。您还可以通过将不同的解析器集作为构造函数参数传递给 DateTimeParser 来使用它们。我的代码很简单,因为我不想写得太深,只是想展示一下方法 =)

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2013-09-04
      • 1970-01-01
      相关资源
      最近更新 更多