【问题标题】:JavaScript Date Comparisons Don't Equal [duplicate]JavaScript日期比较不等于[重复]
【发布时间】:2011-11-06 20:30:24
【问题描述】:

我尝试搜索有类似问题的人,但没有找到任何东西。

我在 JavaScript 中有两个日期,都设置为相同的值...平等测试在 == 上失败,但 >= 和

下面是我在玩的代码:

var startDate = new Date( 2011, 7, 30, 0, 0, 0, 0 );

var dt = new Date( 2011, 7, 30, 0, 0, 0, 0 );

if( startDate == dt )
    document.write('They Equal<br />');

if( startDate > dt )
    document.write('Start Date is > dt<br />');

if( startDate >= dt )
    document.write('Start Date is >= dt<br />');

if( startDate < dt )
    document.write('Start Date is < dt<br />');

if( startDate <= dt )
    document.write('Start Date is <= dt<br />');

if( dt == startDate )
    document.write('They Equal<br />');

if( dt > startDate )
    document.write('dt > startDate<br />');

if( dt >= startDate )
    document.write('dt >= Start Date <br />');

if( dt < startDate )
    document.write('dt < Start Date <br />');

if( dt <= startDate )
    document.write('dt <= Start Date <br />');  

document.write( dt );
document.write( '<br />');
document.write( startDate );

有没有人遇到过这样的事情,还是我做错了什么?

我测试的是 Internet Explorer (9)、Firefox 5+ 和 Chrome。

更新:

所以有两个人为我的问题发布了很好的答案,我感谢你们两个:xdazz 和 DaveRandom。我在 stackoverflow.com 上阅读过一篇关于类似问题的较早帖子,一个人说日期对象可以像其他任何对象一样进行比较,而我发现的任何其他示例总是进行 类型的比较,而不是完全相等,所以我无法就我做错的原因建立联系。

感谢你们两个,以及其他发布类似答案的人。

【问题讨论】:

    标签: javascript date equality


    【解决方案1】:

    这是 Javascript 众多不合逻辑的部分之一。您可以通过使用 .getTime() 将日期转换为数字来解决此问题,该数字将返回从该日期到 1970 年 1 月 1 日 00:00:00 的毫秒数。

    if (a.getTime() === b.getTime()) ...
    

    对象本身的 === 运算符将始终返回 false,因为这两个对象确实是不同的可变 javascript 对象。

    PS:不要在 Javascript 中使用 == 运算符。曾经。它的作用将“疯狂”一词提升到了一个全新的水平。严重地。问题是应用了所有类型的类型转换,这些类型转换根本没有意义,例如你最终会得到像"1"==1x==false &amp;&amp; (x?1:2)==1 甚至a==b &amp;&amp; b==c &amp;&amp; a!=c 这样的东西(例如x=[]a=[1], b=1, c=[[1]]) .只是不要使用==。曾经。这是“FUBAR”。句号。

    【讨论】:

    • 我基本同意后记,但应该用更有意义的东西来支持它,比如:2ality.com/2011/12/strict-equality-exemptions.html
    • @MichaelScheper:我同意那篇文章很好地分析了许多据称有效的用例,但我认为指出为什么它可能非常危险也很重要(即 == 不是传递,或者你可以有 x == falsex 是真实的)。
    【解决方案2】:

    当您使用&lt;=&gt;= 比较两个日期对象时,它们通过valueOf 进行比较,这与getTime 的日期相同。

    但是当你使用==时,它们是相同类型的两个不同对象,所以返回false。

    添加了一些例子:

    > new Date(2011, 7, 30, 0, 0, 0, 0) == new Date( 2011, 7, 30, 0, 0, 0, 0 )
    false
    > new Date(2011, 7, 30, 0, 0, 0, 0).getTime() == new Date( 2011, 7, 30, 0, 0, 0, 0).getTime()
    true
    > new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() == new Date( 2011, 7, 30, 0, 0, 0, 0).valueOf()
    true
    > new Date(2011, 7, 30, 0, 0, 0, 0).valueOf() == new Date( 2011, 7, 30, 0, 0, 0, 0).getTime()
    true
    

    【讨论】:

      【解决方案3】:
      <Script>
      function checkval()
      {
      var strfromdate=document.frmadmin.txtfromdate.value;
      strfromdate=strfromdate.split("/");
      //alert(strfromdate[2]+" "+strfromdate[0]+" "+strfromdate[1]);
      
      var strtodate=document.frmadmin.txttodate.value;
      strtodate=strtodate.split("/");
      
      var fromDate = (new Date( strfromdate[2], strfromdate[0], strfromdate[1], 0, 0, 0, 0 )).getTime();
      var toDate = (new Date( strtodate[2], strtodate[0], strtodate[1], 0, 0, 0, 0 )).getTime();
      //alert(fromDate+" "+toDate);
      
      
      
          if(toDate<fromDate)
          {
              alert("To date should be greater than from date.");
              document.frmadmin.txttodate.focus();
              return false;
          }
      
      
          return true;
      }
      </Script>
      

      【讨论】:

        【解决方案4】:

        我想如果你这样做

        var startDate = (new Date( 2011, 7, 30, 0, 0, 0, 0 )).getTime();
        var dt = (new Date( 2011, 7, 30, 0, 0, 0, 0 )).getTime();
        

        在脚本的顶部,您会发现它有效。

        getTime() 方法以整数形式返回日期,您在此处所做的是比较对象,而不是具体值。

        EDIT修复了上面的代码

        【讨论】:

        • @Shef 只​​有大约 50 秒,我会给你一个 +1 的麻烦;-)
        【解决方案5】:
        var startDate = new Date( 2011, 7, 30, 0, 0, 0, 0 );
        
        var dt = new Date( 2011, 7, 30, 0, 0, 0, 0 );
        
        if( startDate.getTime() == dt.getTime() )
            console.log('They Equal<br />');
        

        【讨论】:

          猜你喜欢
          • 2011-02-14
          • 1970-01-01
          • 2012-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-12
          • 1970-01-01
          相关资源
          最近更新 更多