【问题标题】:Compare javascript dates比较 JavaScript 日期
【发布时间】:2009-07-18 00:01:27
【问题描述】:

我正在将日期与以下内容进行比较:

var dt = new Date();    

dt.setDate("17");               
dt.setMonth(06); 
dt.setYear("2009");

var date = new Date();

console.log("dt(%s) == date(%s) == (%s)", dt, date, (dt == date) );

if( now == dt ) {
    ....
}

字符串值当然是动态的。

在我看到的日志中:

dt(Fri Jul 17 2009 18:36:56 GMT-0500 (CST)) == date(Fri Jul 17 2009 18:36:56 GMT-0500 (CST) == (false)

我尝试了 .equals() 但它不起作用(我正在尝试 JavaScript 的 Java 部分:P)

如何比较这些日期以使它们返回 true?

【问题讨论】:

  • “现在”变量在哪里?您可能想使用 var now = new Date();

标签: javascript date-comparison


【解决方案1】:

以下代码应该可以解决您的问题:

(myDate.getTime() == myOtherDate.getTime())

问题是当你写的时候:

(myDate == myOtherDate)

...您实际上是在问“myDate 是否指向 myOtherDate 指向的同一对象?”,而不是“myDate 是否与 myOtherDate 相同?”。

解决方案是使用getTime 获取一个表示日期对象的数字(并且由于getTime 返回自纪元时间以来的毫秒数,该数字将是精确 Date 对象),然后使用此数字进行比较(比较数字将按预期工作)。

【讨论】:

  • 我是否应该考虑在这个过程中我实际上可能会损失几毫秒? ?
  • 史蒂夫,你所说的日期 == 运算符是不正确的。这不是 C# 或 JAVA。问题是每个 Date 组件都有不同的关联时间,比较结果为 false。
  • @Oscar Reyes:不,“getTime()”返回自纪元时间以来的确切毫秒数,所以一切都应该是正确的。
  • @史蒂夫。有效。让我有点担心的是,在我的示例中,每个 new Date() 调用之间有 3 行,但在我的代码中,我还有几十行。它有可能...... bahhhh谁在乎!,它的工作知道,让我们回家:) :) :)
  • @SolutionYogi:“每个 Date 组件都有不同的关联时间”是什么意思?您可以有两个日期对象表示完全相同的时间(其中“getTime()”返回相同的数字),== 运算符将返回 false。
【解决方案2】:

您的代码的问题是您正在比较时间/日期部分,而不仅仅是日期。

试试这个代码:

    var myDate = new Date();
    myDate.setDate(17);
    myDate.setMonth(7);
    myDate.setYear(2009);

    //Delay code - start
    var total = 0;
    for(var i=0; i<10000;i++)
        total += i;
    //Delay code - end

    var now = new Date();

    console.log(now.getTime() == myDate.getTime());

如果您保留 for 循环代码(由“延迟代码 -start”标识),控制台将显示“false”,如果您删除 for 循环代码,控制台将记录“true”,即使在这两种情况下 myDate 都是2009 年 7 月 17 日,“现在”是 2009 年 7 月 17 日。

问题在于 JavaScript 日期对象同时存储日期和时间。如果只想比较日期部分,就得自己写代码了。

function areDatesEqual(date1, date2)
{
    return date1.getFullYear() == date2.getFullYear() 
            && date1.getMonth() == date2.getMonth()
            && date1.getDate() == date2.getDate();
}

如果两个 javascript 的“日期部分”相等,忽略相关的时间部分,此函数将打印“真”。

【讨论】:

  • 永远不要使用“getYear()”——它已被弃用。相反,请使用“getFullYear()”。
  • 你是对的,我的错。但我希望你能明白我的意思,你原来的答案是你说日期比较“参考”而不是价值。
  • 哦,我害怕这会发生。实际上我知道,但不想面对它:P 所以.. 使用您显示的内容 + getHour() 和 getMinute 等的函数是否正常?
  • @SolutionYogi:试试这个:'var a = { name: "Foo" }; var b = {名称:“Foo”};'。这些对象是相同的,对吧?现在,比较它们:'(a == b)'。结果将是“假的”。这样做的原因是,尽管对象是相同的,但它们是两个独立的对象(变量 'a' 和 'b' 指向不同的对象)——这就是“==”运算符正在检查的内容。 Date 对象发生的事情是相同的。我的解决方案是使用“getTime()”获取代表 Date 对象的数字并比较这两个数字(这将按预期工作,因为不涉及指针)。
  • @Oscar Reyes:这取决于您要比较的内容。您想查看日期是否完全相同(直到最后一毫秒)?如果是这种情况,请使用我的解决方案。但是,如果您只想查看日期是否为同一天(即年、月、日相同;小时、分钟、秒、毫秒不同),请使用 SolutionYogi 的“areDatesEqual”函数。
【解决方案3】:
=> (myDate.getTime() == myOtherDate.getTime())

(myDate == myOtherDate) 不起作用,它比较两个对象(指针)而不是它们包含的值。使用 getTime 获取 Date 的整数表示,然后进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2012-01-04
    • 2011-02-14
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多