我正在尝试构建一个验证器,它将使用.NET的DefaultModelBinder,使用DateTime.Parse将字符串从表单发布转换为DateTime。我不想等到日期已经发布到服务器上才能意识到这是一个糟糕的约会。
目前,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糟糕的Date解析器,这个:
275481/69/100089
将评估为有效,至275760年9月12日。
另一方面,这是:
2013年11月19日
评估为无效。
当然,据我所知,C#的DateTime.Parse()会考虑文化(本地化)和闰年等问题,我可以接受假定(美国)文化,并允许“02-29-2013”在客户端上并在服务器上启动它(理想情况下不是,但它是可以接受的)。
但是我不敢相信有人没有把更好的日期验证器放在一起使用C#的DateTime.Parse()逻辑。
也许有人,我还没找到 - 这就是我在这里发帖的原因。
而且我知道我有几种方法可以解决这个问题 - 从非常简单(不太准确)到极其复杂(更准确),但我希望有人已经走下这条路并找到了最佳点。 / p>
答案 0 :(得分: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 :(得分:2)
老实说,最好的办法是执行AJAX命令,并要求ASP.net网络服务器解析字符串并返回Javascript日期。
Javascript库容易与不同的语言环境混淆,例如:
GET /ParseDate.ashx?dateStaring=06/01/34 4:53:05 غ.و&locale=ar-SA
这真的很复杂,因为:
"6/1/34" = November 19, 2012
支持Windows的.NET框架支持许多不同的语言环境。
答案 2 :(得分:1)
您没有尝试找到具有类似验证和解析的两个Datetime实现(一个用于JS,另一个用于C#),而是考虑让客户端1)使用自己的库来验证日期,2)解析并重新格式化日期为C#友好格式?
这将允许您使用DateJS为日期输入获得一个非常灵活的前端,使处理客户端文化更容易,并让您的服务器端处理固定格式。
答案 3 :(得分:0)
您是否尝试过将字符串传递给构造函数?
以下是https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date
的示例var birthday = new Date("December 17, 1995 03:24:00");