10

我正在尝试构建一个验证器,该验证器将与 .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 糟糕的日期解析器,这:

275481/69/100089

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

另一方面,这是:

11-19-2013

将评估为无效

当然,我知道 C# 的 DateTime.Parse() 考虑了文化(本地化)和闰年之类的东西,我可以假设一个固定的(美国)文化,并在客户端上允许“02-29-2013”并在服务器上将其踢出(理想情况下不是,但这是可以接受的)。

但我不敢相信有人没有组合一个更好的日期验证器来使用 C# 的 DateTime.Parse() 逻辑。

也许有人有,我只是还没找到——这就是我在这里发帖的原因。

而且我知道我有几种方法可以解决这个问题——从非常简单(不太准确)到非常复杂(更准确),但我希望有人已经走上了这条路并找到了最佳点。

4

4 回答 4

5

Datejs对我来说似乎很健壮。它的解析功能支持超过 150 种文化:

Date.parse("February 20th 1973")

如果您需要解析在当前文化中无效的日期字符串,您可以使用parseExact函数:

// The Date of 15-Oct-2004
Date.parseExact("10/15/2004", ["M/d/yyyy", "MMMM d, yyyy"]);
于 2012-11-19T22:07:58.403 回答
3

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

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

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

这变得非常复杂,因为:

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

.NET 框架(以 Windows 为后盾)支持许多不同的语言环境。

于 2012-11-19T21:56:19.590 回答
1

您是否考虑过让客户端 1) 使用自己的库来验证日期和 2) 将日期解析并重新格式化为C# 友好格式?

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

于 2012-11-19T21:55:14.483 回答
0

您是否尝试过将字符串传递给构造函数?

这是来自https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date的示例

var birthday = new Date("December 17, 1995 03:24:00");
于 2012-11-19T21:48:45.560 回答