【问题标题】:JavaScript help - compare two dates in (dd/MMM/yyyy) formatJavaScript 帮助 - 比较 (dd/MMM/yyyy) 格式的两个日期
【发布时间】:2010-05-11 16:59:39
【问题描述】:

我正在尝试比较一个 aspx 表单上的两个文本框值。这两个值都代表日期。它们的格式类似于“dd/MMM/yyyy”。如何在 JavaScript 中比较它们以查看它们是否不相等以及哪个更大等?

JavaScript 有这样的字符串的日期构造函数吗?任何提示将不胜感激。

【问题讨论】:

  • 这不是“欧元”格式。欧洲使用了许多不同的日期格式。
  • 对不起,重点是“dd/MMM/yyyy”格式。如何比较两个日期。
  • 一年只有12个月,你怎么能拥有MMM?
  • @Byron Whitlock:可能是指英文缩写月份名称(Jan、Feb)等。毕竟我们这里都是说英语的。

标签: javascript date compare


【解决方案1】:

你想使用 Date.parse() 所以要以毫秒为单位转换为 Unix 时间戳:

var d = Date.parse("Jul 8, 2005");
> 1120773600000 

您现在可以将日期作为整数值进行操作。

【讨论】:

  • 是的,这样更好,日期对象已经具有可比性,所以如果你有一个字符串,就可以了。
  • Date.parse() 真的很有用。它为您省去了必须自己进行所有输入解析的麻烦。这就像您希望的那样:new Date(Date.parse("21/May/2010"))
  • 嗯,.parse 似乎不喜欢这种格式的日期。当我尝试时,我得到一个 NAN。我错过了什么吗?
  • 不能真正依赖日期解析。它(据说)保证做的是解析实现的toString()toUTCString() 方法返回的字符串。你猜怎么着?这些输出的格式取决于实现:(如果他们当然会返回一些定义的格式,那就太好了。
【解决方案2】:

阅读Date object

【讨论】:

    【解决方案3】:

    将日期转换为 UNIX 时间戳,然后只比较值。

    if (date1.getTime() > date2.getTime()) alert("bla");
    

    更准确地说,getTime 函数返回自 1970/01/01 以来的毫秒数:http://www.w3schools.com/jsref/jsref_getTime.asp

    还有一点关于 UNIX 时间的解释:http://en.wikipedia.org/wiki/Unix_time

    【讨论】:

    • 我认为这正是他遇到的问题。也就是将字符串表示形式转换成可以进一步处理的值。
    • 有什么例子吗?我从未听说过 UNIX 时间戳。谢谢!
    【解决方案4】:

    遗憾的是,Date.parse 方式并不可靠,甚至对于 ISO 格式也不可靠。

    下面是一个快速的一次性函数,用于解析您当前使用的格式的日期。如果您愿意,可以添加一些健全性检查以查看这一天是否在每个月的范围内(不要忘记闰年 :)),但如果可以合理控制发送的字符串,则此方法有效。

    function parseThisYourVeryKnownFormatToDate(dateString /* '12/Jun/2010' */) {
      function getMonthIdx(monthName) {
        var months = {
          'Jan':0, 'Feb':1, 'Mar':2, 'Apr':3, 'May':4, 'Jun':5
          , 'Jul':6, 'Aug':7, 'Sep':8, 'Oct':9, 'Nov':10, 'Dec':11
        };
        return months[monthName];
      }
      var format = /^(\d+)\/(\w{3})\/(\d{4})$/;
      var match = format.exec(dateString);
      if (!match) {return undefined;}
      var day = match[1], monthIdx = getMonthIdx(match[2]), year = match[3];
      return new Date(year, monthIdx, day);
    }
    
    var testDates = ['10/Jan/2008', '15/Jun/1971', '31/Dec/1999', 'bogus/date/foo'];
    for (var idx=0, len=testDates.length; idx<len; ++idx) {
      console.log(parseThisYourVeryKnownFormatToDate(testDates[idx])); // real date objects, except for the last
    }
    
    var d0 = (parseThisYourVeryKnownFormatToDate('15/Apr/2009'));
    var d1 = (parseThisYourVeryKnownFormatToDate('12/Apr/2009'));
    console.log(d0+' is after '+d1+': '+(d0.getTime()>d1.getTime())); // says true
    console.log(d1+' is after '+d0+': '+(d1.getTime()>d0.getTime())); // says false
    console.log(d0+' is after '+d0+': '+(d0.getTime()>d0.getTime())); // says false
    

    【讨论】:

      【解决方案5】:

      如果你只想做一个比较,那么你可以这样做:

      compareDates(d1, d2) {
        d1 = d1.split("/").reverse().join("/");
        d2 = d2.split("/").reverse().join("/");
        return d1 == d2 ? 0 : d1 < d2 ? : -1 : 1;
      }
      

      假设参数的格式为“dd/mm/yyyy”,如果 d1 == d2,此函数将返回 0,如果 d1 d2,则返回 1。

      PS:如果你的阵列不知道如何reverse,教他们如何:

      Array.prototype.reverse = function() {
       var a = [];
       for(var i=this.length; i; i--) a.push(this[i-1]);
       return a;
      }
      

      编辑:好的,我没有注意到“MMM”格式。我想我会使用月份名称的哈希值。

      function compareDates(date1,date2) {
       var d1 = date1.split("/").reverse();
       var d2 = date2.split("/").reverse();
      
       var months = { 'Jan':'01', 'Feb':'02' }; // ...
      
       d1[1] = months[d1[1]] || '00';
       d2[1] = months[d2[1]] || '00';
      
       date1 = d1.join("/");
       date2 = d2.join("/");
      
       return date1 == date2 ? 0 : date1 < date2 ? : -1 : 1;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        相关资源
        最近更新 更多