JS日期比较是如何工作的?

8

假设我有一个经过正确构造的Date对象,它是从字符串"Tue Jan 12 21:33:28 +0000 2010"中获得的。

var dateString = "Tue Jan 12 21:33:28 +0000 2010";
var twitterDate = new Date(dateString);

然后我使用<>比较运算符来判断它是否比同样构造的Date更近还是更早。这些运算符用于比较日期的算法是否已经被指定,还是像localeCompare一样“特别未指定”?换句话说,我能否保证以这种方式得到更近的日期?

var now = new Date();
if (now < twitterDate) {
    // the date is in the future
}

是的,你可以用这种方式获取最近的日期。 - polin
3个回答

8

ECMAScript中对象的关系运算依赖于内部ToPrimitive函数(带有提示数字),当定义时,可以使用valueOf进行访问。

尝试一下

var val = new Date().valueOf();

你将获得日期的内部值,就像许多语言一样,这是自1970年1月1日UTC午夜以来的毫秒数(使用getTime()将得到相同的值)。

这意味着,通过设计,您可以确保日期比较始终正确工作。

本文将为您提供有关toPrimitive的更多详细信息(但与比较无关)。


1
在Javascript中,日期值是数字,正如ECMA Script specification所述。因此,日期值被视为数字进行比较。
这是您代码的演示(我将twitterDate设置在未来)。
(function(){
    var dateString = "Tue Jan 12 21:33:28 +0000 2014";
    var twitterDate = new Date(dateString);

    var now = new Date();
    if (now < twitterDate) {
         document.write('twitterDate is in the future');
    }
    else
    {
        document.write('twitterDate is NOT in the future');
    }

})()​

1

我认为是的。使用if (now < twitterDate),它会评估为if (now.valueOf()<twitterDate.valueOf())valueOf()提供了自1970年01/01 00:00:00以来经过的毫秒数,因此这两个数字的比较是有效的。

像这样检查它

var then = new Date("Tue Jan 12 21:33:28 +0000 2010")
   ,now  = new Date;

console.log(then.valueOf(),'::',now.valueOf(),'::',now<then);
  //=> 1263332008000 :: 1352365105901 :: false

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