2011-11-23 201 views
1

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

在我的代码我打电话JSON格式序列化的Web服务方法,并返回下面的类

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

我忘了提,我需要比较只有日期部分(这是因为这样的时代我没有比较毫秒)。

+0

我不知道为什么不工作,但是你可以在日期转换为字符串(.toString,.toGMTString,.toUTCString,.toISOString)并将其用于比较。似乎工作。 – ampersand

+0

也请参阅:http://stackoverflow.com/questions/7244513/javascript-date-comparisons-dont-equal – ampersand

回答

4

你可以做

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

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小特别:) – Lorenzo

+0

@Lorenzo你走了。这应该工作 – Ktash

+0

+1良好的发现,内置的功能总是最好的。 – maerics

0

首先,当你有一个“日期(1322002860000)”,数字部分是因为时代的毫秒数。

你所要做的是:

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

您还可以使用更高级的时代转换,像他们正在做那边:http://www.esqsoft.com/javascript_examples/date-to-epoch.htm

希望这有助于!

+0

感谢您指出这一点。无论如何,我对转换日期没有任何问题。只是比较部分的问题... – Lorenzo

+0

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小特别:) – Lorenzo

0

,你应该把它们转换成一个JavaScript Date对象,如:

var d = new Date(); 
d.setTime(1321743660000); 

那么你可以比较。见http://www.w3schools.com/jsref/jsref_obj_date.asp更多信息

+1

更多信息请参见[http://w3fools.com](http://w3fools.com):P' –

+0

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小的特殊:) – Lorenzo

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 
} 
+0

使用三重平等是矫枉过正的花花公子;-)但这是正确的解决方案! –

+0

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小的特殊:) – Lorenzo

+0

@DominicGoulet:也许,但它已成为JS社区的最佳实践,在这种情况下它不会造成任何伤害,所以我会坚持下去=) – maerics

0

您可以使用JSON.parse代替eval,并使用齐磊构建日期如下所述: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); }) 

这使用替换函数替换器来构造一个新的日期对象,其毫秒自开始是来自组1的数值。

+0

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小特别:) – Lorenzo

2

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

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

} 

回答您的问题编辑

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

} 
+0

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小的特定:) – Lorenzo

+0

@洛伦佐 - 检查我编辑的答案。 – ShankarSangoli

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 

其次,如果你抓住该值的数字porition(时代价值,以毫秒为单位),你实际上并不需要创建一个新的Date对象对它们进行比较。为什么不直接比较数字呢?

编辑:按照您的编辑,如果你只是想比较一下“日期”部分:

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

感谢您的回答。你能看看我的编辑吗?我忘了提及一个小特别:) – Lorenzo

+0

@Lorenzo更新 – Matt