javascript日期时间比较

时间:2011-11-23 16:16:02

标签: javascript jquery datetime

我需要在javascript中比较两个日期。

在我的代码中,我正在调用一个Web服务方法,该方法序列化并以JSON格式返回以下类的实例

public class MyPeriod
{
    public int PeriodID { get; set; }
    public DateTime BeginDate { get; set; }
    public DateTime FirstDeadline { get; set; }
    public DateTime SecondDeadline { get; set; }
    public DateTime EndDate { get; set; }
} 

这将产生一个像这样的JSON片段:

{
    "d": {
        "PeriodID":26,
        "BeginDate":"\/Date(1321743660000)\/",
        "FirstDeadline":"\/Date(1322002860000)\/",
        "SecondDeadline":"\/Date(1322002860000)\/",
        "EndDate":"\/Date(1322168400000)\/"
    }
}

现在我需要将FirstDeadlineSecondDeadline进行比较,因此在我的javascript中我有一个像这样的片段

var date1 = eval(data.d.FirstDeadline.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
var date2 = eval(data.d.SecondDeadline.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
if (date1 === date2) {
    ...
}

不幸的是,即使日期具有相同的值,相等的比较也不起作用。 有什么帮助吗?

更新1

我忘了提到我只需要比较日期部分(这是我不比较自纪元以来的毫秒数)。

7 个答案:

答案 0 :(得分:4)

你可以做到

if(date1.toDateString() === date2.toDateString()) {

答案 1 :(得分:3)

尝试比较它们的“时间”(自纪元以来的毫秒数)值:

if (date1.getTime() === date2.getTime()) {
  // OK
}

<强> [编辑]

如果你只关心日期而不关心时间,那么这样的事情就可以了:

function sameDate(d1, d2) {
  return ((d1.getFullYear() === d2.getFullYear())
       && (d1.getMonth() === d2.getMonth())
       && (d1.getDate() === d2.getDate()));
}
if (sameDate(date1, date2)) {
  // OK
}

答案 2 :(得分:2)

尝试使用getTime对象的Date方法进行日期比较。像这样的一些东西会比较时间滴答。

if (date1.getTime() == date2.getTime()) {

}

回答您编辑过的问题

if(date1.getMonth() == date1.getMonth() && 
   date1.getDate() == date2.getDate() &&
   date1.getFullYear() == date2.getFullYear()){

}

答案 3 :(得分:2)

首先,你的比较如果失败,因为===运算符寻找绝对相等。但是您构建了两个不同的日期对象。比较日期对象与比较原始值(例如数字)不同。因此,即使日期代表相同的值,===也总会失败。

var a = new Date(100000);
var b = new Date(100000); 
console.log(a === b); // false
console.log(a.getTime() === b.getTime()); // true

var a = new Date(100000);
var a = b;
console.log(a === b); // true

其次,如果您正在抓取该值的数字部分(纪元值,以毫秒为单位),您实际上不需要创建新的Date对象来比较它们。为什么不直接比较数字?

编辑:根据您的编辑,如果您只是想比较“日期”部分:

 if(date1.getDay() === date2.getDay() && date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear()){ 
 }

答案 4 :(得分:0)

首先,当你有'Date(1322002860000)'时,数字部分是自纪元以来的毫秒数。

你要做的是:

var myDate = new Date();
myDate.setTime(1322002860000);

您还可以使用更高级的纪元转换器,就像他们在那里做的那样:http://www.esqsoft.com/javascript_examples/date-to-epoch.htm

希望这有帮助!

答案 5 :(得分:0)

你应该将它们转换为javascript Date对象,如:

var d = new Date();
d.setTime(1321743660000);
那么你可以比较。有关详细信息,请参阅http://www.w3schools.com/jsref/jsref_obj_date.asp

答案 6 :(得分:0)

您可以使用JSON.parse代替eval,并使用reviver构建日期,如下所述:How to use JSON.parse reviver parameter to parse date string

如果您知道JSON来自可靠来源,则可以更改

.replace(/\/Date\((\d+)\)\//gi, "new Date($1)")

.replace(/\/Date\((\d+)\)\//gi,
         function (_, n) { return new Date(+n); })

使用替换函数替换器来构造一个新的日期对象,其millis-since-epoch是组1中的数值。