【问题标题】:Validate two dates of this "dd-MMM-yyyy" format in javascript在 javascript 中验证此“dd-MMM-yyyy”格式的两个日期
【发布时间】:2010-08-18 07:02:36
【问题描述】:

我有两个日期 18-Aug-201019-Aug-2010 这种格式。如何判断哪个日期更大?

【问题讨论】:

  • 您的问题可能与此问题重复:stackoverflow.com/questions/492994/… 那里描述的解决方案应该对您有所帮助。
  • 文本的语言是否保证是英文?
  • @David 听不懂你想说什么?
  • 18-Aug 是英语特定...10-Oct 是英语,但在印度尼西亚(例如)它将是 10-Okt 等... MMM desc 取决于语言...除非您保证使用特定语言

标签: javascript validation date


【解决方案1】:

您将需要创建一个自定义解析函数来处理您想要的格式,并获取日期对象进行比较,例如:

function customParse(str) {
  var months = ['Jan','Feb','Mar','Apr','May','Jun',
                'Jul','Aug','Sep','Oct','Nov','Dec'],
      n = months.length, re = /(\d{2})-([a-z]{3})-(\d{4})/i, matches;

  while(n--) { months[months[n]]=n; } // map month names to their index :)

  matches = str.match(re); // extract date parts from string

  return new Date(matches[3], months[matches[2]], matches[1]);
}

customParse("18-Aug-2010");
// "Wed Aug 18 2010 00:00:00"

customParse("19-Aug-2010") > customParse("18-Aug-2010");
// true

【讨论】:

    【解决方案2】:

    您可以根据给定的格式手动进行解析,但我建议您使用 date.js 库将日期解析为 Date 对象,然后进行比较。 看看,太棒了!

    此外,它是您的 js 实用工具箱的重要补充。

    【讨论】:

      【解决方案3】:

      原生Date可以解析“MMM+ dd yyyy”,得到:

      function parseDMY(s){
        return new Date(s.replace(/^(\d+)\W+(\w+)\W+/, '$2 $1 '));
      }
      +parseDMY('19-August-2010') == +new Date(2010, 7, 19) // true
      parseDMY('18-Aug-2010') < parseDMY('19-Aug-2010')     // true
      

      【讨论】:

        【解决方案4】:

        首先,'dd-MMM-yyyy' 格式不是Date 构造函数可接受的输入格式(它返回一个“无效日期”对象),因此我们需要自己解析它。让我们编写一个函数,从这种格式的字符串中返回一个Date 对象。

        函数 parseMyDate(s) {
            var m = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec '];
            var match = s.match(/(\d+)-([^.]+)-(\d+)/);
            var 日期 = 匹配 [1];
            var monthText = match[2];
            变种年份=匹配[3];
            var 月 = m.indexOf(monthText.toLowerCase());
            返回新日期(年、月、日);
        }

        Date 对象隐式类型转换为一个数字(自 1970 年以来的毫秒数;纪元时间),因此您可以使用普通比较运算符进行比较:

        if (parseMyDate(date1) > parseMyDate(date2)) ...

        【讨论】:

        • 不要使用 hackish * 1 hack 将结果转换为整数,而应该使用 parseInt(s.match(/(\d+)/g)[1], 10) 来获取 Integer 对象。
        • 使用 OP 的格式 s.match(/(\d+)/g); 将返回一个两元素数组,例如"12-Aug-2010".match(/(\d+)/g); // ["12", "2010"],您正在访问 12 索引。您还需要一些方法将三个字母的月份名称与月份编号映射......
        • @Denis 在这种情况下我们甚至不需要将字符串转换为数字,Date constructor 将在内部转换每个参数ToNumber ;)
        • @CMS,我已经解决了这两个问题。通过删除“全局搜索”标签修复了第一个问题。修复第二个,使用indexOf搜索。
        • @Delan,很好,你只需要再次调整你的索引来匹配 dateyear (你可以毫无问题地删除那些丑陋的* 1):)
        【解决方案5】:

        更新:IE10、FX30(可能更多)将理解“2010 年 8 月 18 日”而没有破折号 - Chrome 也可以处理

        所以Date.parse("18-Aug-2010".replace("/-/g," ")) 在这些浏览器(以及更多)中工作

        Live Demo

        因此

        function compareDates(str1,str2) {
          var d1 = Date.parse(str1.replace("/-/g," ")),
              d2 = Date.parse(str2.replace("/-/g," "));
          return d1<d2;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-30
          • 2016-05-06
          • 1970-01-01
          • 1970-01-01
          • 2018-02-14
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          相关资源
          最近更新 更多