2010-05-11 50 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; 
}