2012-11-19 55 views
9

我想构建一个验证器,它将使用.NET的DefaultModelBinder使用DateTime.Parse将表单帖子中的字符串转换为DateTime。我不想等到某个日期发布到服务器上,才意识到这是一个糟糕的日期。Javascript等价于.NET的DateTime.Parse

目前jquery.validate使用下面的代码来验证日期字段:

// http://docs.jquery.com/Plugins/Validation/Methods/date 
date: function(value, element) { 
    return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); 
} 

然而,由于JavaScript的可怕的日期解析器,这样的:

275481/69/100089

将评估为有效,至275760年9月12日。

而在另一方面,这样的:

2013年11月19日

将评估为无效。当然,我明白C#的DateTime.Parse()将文化(本地化)和闰年等事物考虑在内,我可以接受假设固定的(美国)文化,并允许“02-29-2013” “在客户端上,并在服务器上踢出去(理想情况下不是,但它是可以接受的)。

但我不敢相信有人没有把更好的日期验证器放在一起工作与C#的DateTime.Parse()逻辑。

也许有人有,我只是没有找到它 - 这就是为什么我在这里发布。

而且我知道我有很多方法可以解决这个问题 - 从简单(不太准确)到非常复杂(更准确),但是我希望有人已经走过这条路,找到了最佳位置。

+4

DateJS可能是适当的在这里,但不可否认,即使那样,它也不完美。 http://www.datejs.com/ –

+1

定期表达? –

+0

@GrantH。我想过date.js,但正如你所说,它看起来有缺点。如果我在这里没有得到更好的建议,那可能就是我要走的路 - 可能与正规表达式结合使用。 –

回答

5

Datejs对我来说似乎非常健壮。它parse功能支持超过150个文化:

Date.parse("February 20th 1973") 

而如果你需要解析日期字符串无效在当前的文化,你可以使用parseExact功能:

// The Date of 15-Oct-2004 
Date.parseExact("10/15/2004", ["M/d/yyyy", "MMMM d, yyyy"]); 
1

,而不是试图找到两个日期时间实现(一个为JS,另一个用于C#)具有相似的验证和分析样本,您是否考虑过客户端1)使用其自己的图书馆来验证日期和2)解析并重新格式化为C#友好格式的日期?

这将允许您使用DateJS获得一个非常灵活的日期输入前端,更容易处理客户端文化,并让您的服务器端处理固定格式。

2

诚实地说,您最好的选择是执行AJAX命令,并要求您的ASP.net Web服务器解析字符串并返回Javascript日期。

Javascript库容易与不同的语言环境混淆,例如:

GET /ParseDate.ashx?dateStaring=06/01/34 4:53:05 غ.و&locale=ar-SA 

它得到非常复杂,因为:它背后

"6/1/34" = November 19, 2012 

.NET Framework中,与Windows,有很多不同的语言环境的支持。