在JavaScript中比较两个日期

7

我正在尝试比较两个日期。我有这段代码,我以为它会很好用,但实际上并不是这样。现在我只想通过警报来显示错误,如果结束日期小于开始日期。日期格式yyyy-mm-dd需要保留此格式以供此前的其他事件使用。这段代码有什么问题?

   startdate = "2009-11-01" ;
   enddate  = "2009-11-04" ;

   var d1 = new Date(startdate)
   var d2 = new Date(enddate)

   if (d2 < d1) {
      alert ("Error ! ) ;
   }

   document.cookie='st =' + startdate // set sytem cookie
   document.cookie='en =' + enddate
   window.location = self.location.href
   window.opener.location.reload()
   close()

你可以按字典顺序比较 'yyyy-mm-dd' 日期字符串:enddate < startdate - Robert
7个回答

11

尝试使用DateJS,这是一个开源的JavaScript日期库,可以处理几乎所有日期需求!以下示例已经可用:

<script type="text/javascript" src="date.js"></script>
<script>

    startdate = "2009-11-01";
    enddate  = "2009-11-04"; 

    var d1 = Date.parse(startdate);
    var d2 = Date.parse(enddate) ;

    if (d1 < d2) {
        alert ("Error!");
    }

</script>

1
这是一个很好的解决方案,除了当前的datejs文件大小为24kb。 - Michael J. Calkins

3

Date 构造函数无法解析该格式,既然您无法更改它,您应该手动解析并将 yearmonthdate 部分传递给它,例如:

function compareDates(startDate, endDate) {

  // parse a date in yyyy-mm-dd format
  function parseDate(input) {
    var parts = input.match(/(\d+)/g);
    return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
  }

  if (parseDate(endDate) < parseDate(startDate)) {
    alert ("Error !");
  }
}

使用方法:

var startDate = "2009-11-01",
    endDate = "2009-11-04";
compareDates(startDate, endDate);    

+1 对于一个从头到尾的解决方案,但我并不是真的很喜欢在函数内部声明函数。 (说实话,我甚至对Javascript中任何地方的函数声明都不是很感兴趣。) - eyelidlessness
2
@eyelidlessness:JavaScript仅具有函数作用域,没有像其他语言一样的块级作用域,在函数内部声明函数使parseDate成为局部变量,并保持全局命名空间的清洁。当然,如果您打算在其他函数中使用parseDate,则必须将其放在其他地方。 :-) - Christian C. Salvadó

3
var myDate=new Date();
myDate.setFullYear(2010,0,14);
var today = new Date();

if (myDate>today)
{
    alert("Today is before 14th January 2010");
}
else
{
    alert("Today is after 14th January 2010");
}

来源:http://www.w3schools.com/jS/js_obj_date.asp

JavaScript日期对象是用于处理日期和时间的对象。它们被创建使用Date()构造函数。
以下是一些有用的方法:
getDate() - 返回月份的某一天(1-31)
getDay() - 返回星期几(0-6)
getFullYear() - 返回年份(四位数)
getHours() - 返回小时(0-23)
getMilliseconds() - 返回毫秒(0-999)
getMinutes() - 返回分钟(0-59)
getMonth() - 返回月份(0-11)
getSeconds() - 返回秒钟(0-59)
getTime() - 返回自 1970 年 1 月 1 日以来的毫秒数
toString() - 把 Date 对象转换为字符串
您可以使用这些方法来获取特定日期和时间的各个部分。

3

有人终于使用ISO 8601标准日期,但是……

您正在使用一种不错的国际标准,JavaScript应该理解这种标准。但它没有。

问题在于您的日期格式符合ISO 8601标准,而内置的Date.parse()无法读取。

JavaScript实现了早期的IETF日期,来自RFC 822/1123。其中一个解决方案是将它们调整为RFC样式,您可以在RFC1123中看到,它们看起来像dd month yyyy

有些编码可以全面扫描ISO格式,现在您知道要搜索“iso standard date”,就可以找到它。在这里我找到了这个:

Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

js> t = new Date()
Sun Nov 01 2009 09:48:41 GMT-0800 (PST)
js> t.setISO8601("2009-11-01")
js> t

Sat Oct 31 2009 17:00:00 GMT-0700 (PDT)

11-01 在我的时区被重新解释,只要所有的日期都得到相同的转换,它们就可以合理地进行比较,否则您可以将 TZ 信息添加到您的字符串或 Date 对象中。


1
为什么这么复杂?只需要一个简单的正则表达式来将连字符(-)替换为斜杠(/):var dateString = '2009-11-01'; alert(new Date(dateString.replace(/-/g,'/')));结果显示:Sun Nov 01 2009 00:00:00 GMT+1000 - RobG
叹气,说得好,但这更加需要JS理解ISO日期的原因。 - DigitalRoss

1
如果您只需要知道一个日期是否在另一个日期之前,您可以使用Date对象的getTime()方法来比较它们自1970年1月1日午夜以来的毫秒数。
if( d2.getTime() < d1.getTime() )
{
    alert("eeeek!");
}

不要混淆并尝试使用 getMilliseconds(),哈哈 :)

w3schools getTime() 文档


但是 d2.getTime() < d1.getTime() 不就等同于 d2 < d1 吗? - Robert

-1

使用 JavaScript 中的此函数进行日期比较:

    function fn_DateCompare(DateA, DateB) {
      var a = new Date(DateA);
      var b = new Date(DateB);

      var msDateA = Date.UTC(a.getFullYear(), a.getMonth()+1, a.getDate());
      var msDateB = Date.UTC(b.getFullYear(), b.getMonth()+1, b.getDate());

      if (parseFloat(msDateA) < parseFloat(msDateB))
        return -1;  // less than
      else if (parseFloat(msDateA) == parseFloat(msDateB))
        return 0;  // equal
      else if (parseFloat(msDateA) > parseFloat(msDateB))
        return 1;  // greater than
      else
        return null;  // error
  }

-1

我根据当前时间实现了下面的代码来进行日期比较 - -

// get the current time from a hidden input which is being set by server time 
// because client may have a wrong time
var ch = jQuery('#clockHours').val(); // e.g. 9,10 etc.
ch = parseInt(ch);
// get the today's date from a server value as well
var td = jQuery('#clockDate').val(); // may be => new Date(); e.g. 2014-05-15
td = Date.parse(td);
td.setHours(0, 0, 0, 0);
// get the input date
var inpdate = jQuery('#jform_in_date').val(); // may be => new Date(); e.g. 2014-05-15
inpdate = Date.parse(inpdate);
inpdate.setHours(0, 0, 0, 0);
// get yesterday's date. this is from server as well
yd = new Date();
yd.setFullYear(td.getFullYear(), td.getMonth(), td.getDate()-1);
yd.setHours(0, 0, 0, 0);
alert('today\'s date is: '+td.toString());
alert('yesterday\'s date is: '+yd.toString());
// if it is not 10 AM then dates from yesterday are valid
if(ch <= 9) {
   if(inpdate.getTime() >= yd.getTime()) {
       alert('Valid: dates from yesterday are allowed');
   } else {
       alert('Invalid: dates before yesterday are not allowed');
   }
} else {
   if(inpdate.getTime() >= td.getTime()) {
       alert('Valid: dates from today are allowed');
   } else {
       alert('Invalid: dates before today are not allowed');
   }
}

我希望这可以非常清晰地帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接