2011-11-23 268 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