2010-05-11 67 views
2

我試圖比較兩個文本框的aspx表單上的值。這兩個值都代表日期。它們格式化爲「dd/MMM/yyyy」。我怎樣才能比較他們在JavaScript中,看看他們是不是平等和哪一個更大等?JavaScript幫助 - 比較(dd/MMM/yyyy)格式的兩個日期

JavaScript是否有像這樣的字符串的日期構造函數?任何提示將不勝感激。

+1

這不是「歐元」格式。歐洲有許多不同的日期格式在使用。 – 2010-05-11 17:02:41

+0

對不起,重點是「dd/MMM/yyyy」格式。我如何比較兩個日期。 – Hcabnettek 2010-05-11 17:07:06

+0

一年只有12個月的時候,你怎麼能擁有MMM? – 2010-05-11 17:08:08

回答

0

將日期轉換爲UNIX時間戳,然後比較這些值。

if (date1.getTime() > date2.getTime()) alert("bla"); 

是有點更精確的的getTime函數返回自1970/01/01毫秒數:http://www.w3schools.com/jsref/jsref_getTime.asp

而且關於UNIX時間一點解釋:http://en.wikipedia.org/wiki/Unix_time

+0

好主意,他怎麼能做到這一點?是的代碼幫助:) – 2010-05-11 17:09:16

+1

我認爲這正是他遇到的問題。也就是說,將字符串表示轉換爲可以進一步處理的值。 – 2010-05-11 17:09:17

+0

任何例子?我從來沒有聽說過UNIX時間戳。謝謝! – Hcabnettek 2010-05-11 17:09:26

3

你想用Date.parse() 所以要轉換爲Unix時間戳(毫秒):

var d = Date.parse("Jul 8, 2005"); 
> 1120773600000 

現在,您可以操縱日期的積分值。

+0

是的,這樣比較好,日期對象已經可以比較,所以如果你有一個字符串,那麼你就去。 – rnaud 2010-05-11 17:18:22

+0

'Date.parse()'真的很有用。它可以節省您自己完成所有輸入解析的麻煩。這種方式按照你希望的方式工作:'Date(Date.parse(「21/May/2010」))' – 2010-05-11 17:24:57

+0

hmm,.parse似乎不喜歡那種格式的日期。當我嘗試時我會得到一個NAN。我錯過了什麼嗎? – Hcabnettek 2010-05-11 17:49:24

0

不幸的是,Date.parse的方式是不可靠的,即使是ISO格式。

下面是一個快速的one-off-ish函數,用於解析當前使用的格式的日期。如果你喜歡,你可以添加一些理智檢查,看看這一天是否在每個月的範圍內(不要忘記當年的閏年:)),但是如果一個人能夠合理控制一個人發送的字符串,這就可以工作。

function parseThisYourVeryKnownFormatToDate(dateString /* '12/Jun/2010' */) { 
    function getMonthIdx(monthName) { 
    var months = { 
     'Jan':0, 'Feb':1, 'Mar':2, 'Apr':3, 'May':4, 'Jun':5 
     , 'Jul':6, 'Aug':7, 'Sep':8, 'Oct':9, 'Nov':10, 'Dec':11 
    }; 
    return months[monthName]; 
    } 
    var format = /^(\d+)\/(\w{3})\/(\d{4})$/; 
    var match = format.exec(dateString); 
    if (!match) {return undefined;} 
    var day = match[1], monthIdx = getMonthIdx(match[2]), year = match[3]; 
    return new Date(year, monthIdx, day); 
} 

var testDates = ['10/Jan/2008', '15/Jun/1971', '31/Dec/1999', 'bogus/date/foo']; 
for (var idx=0, len=testDates.length; idx<len; ++idx) { 
    console.log(parseThisYourVeryKnownFormatToDate(testDates[idx])); // real date objects, except for the last 
} 

var d0 = (parseThisYourVeryKnownFormatToDate('15/Apr/2009')); 
var d1 = (parseThisYourVeryKnownFormatToDate('12/Apr/2009')); 
console.log(d0+' is after '+d1+': '+(d0.getTime()>d1.getTime())); // says true 
console.log(d1+' is after '+d0+': '+(d1.getTime()>d0.getTime())); // says false 
console.log(d0+' is after '+d0+': '+(d0.getTime()>d0.getTime())); // says false 
0

如果你想要做一個比較,那麼你可以這樣做:

compareDates(d1, d2) { 
    d1 = d1.split("/").reverse().join("/"); 
    d2 = d2.split("/").reverse().join("/"); 
    return d1 == d2 ? 0 : d1 < d2 ? : -1 : 1; 
} 

假設參數的格式爲「DD/MM/YYYY」,這個函數將返回0,如果d1 == d2,如果是d1,則爲-1 < d2,如果d1> d2,則爲1。

PS:如果你的陣列不知道如何reverse,教他們如何:

Array.prototype.reverse = function() { 
var a = []; 
for(var i=this.length; i; i--) a.push(this[i-1]); 
return a; 
} 

編輯:我並確定沒有注意到「MMM」格式。那麼我想我會使用月份名稱的散列。

function compareDates(date1,date2) { 
var d1 = date1.split("/").reverse(); 
var d2 = date2.split("/").reverse(); 

var months = { 'Jan':'01', 'Feb':'02' }; // ... 

d1[1] = months[d1[1]] || '00'; 
d2[1] = months[d2[1]] || '00'; 

date1 = d1.join("/"); 
date2 = d2.join("/"); 

return date1 == date2 ? 0 : date1 < date2 ? : -1 : 1; 
}