2012-11-19 100 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,有很多不同的語言環境的支持。