2012-11-19 41 views
9

Tôi đang cố gắng xây dựng trình xác nhận hợp lệ sẽ làm việc với DefaultModelBinder .NET của việc sử dụng DateTime.Parse để chuyển đổi một chuỗi từ dạng biểu mẫu thành một DateTime. Tôi không muốn phải đợi cho đến khi một ngày đã được đăng lên máy chủ để nó nhận ra đó là một ngày tồi tệ.Javascript tương đương với .NET DateTime.Parse

Hiện nay jquery.validate sử dụng đoạn mã sau để xác nhận trường ngày:

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

Tuy nhiên, do ngày phân tích cú pháp khủng khiếp Javascript, đây:

275481/69/100089

Sẽ đánh giá là hợp lệ, đến ngày 12 tháng 9 năm 275760.

Trong khi trên Mặt khác, điều này:

11-19-2013

sẽ đánh giá như không hợp lệ.

Tất nhiên, tôi hiểu rằng DateTime.Parse() của C# có những thứ như văn hóa (nội địa hóa) và năm nhuận, và tôi có thể sống với giả định một nền văn hóa cố định (Hoa Kỳ) và cho phép "02-29-2013 "trên máy khách và khởi động nó ở máy chủ (lý tưởng là không, nhưng có thể chấp nhận được).

Nhưng tôi không thể tin rằng một người nào đó đã không đặt cùng một trình xác thực ngày tốt hơn để làm việc với C# 's DateTime.Parse() logic.

Có thể ai đó có, tôi chưa tìm thấy - đó là lý do tôi đăng bài ở đây. Và tôi biết tôi có một số cách để đi về điều này - từ cực kỳ đơn giản (kém chính xác) đến vô cùng phức tạp (chính xác hơn), nhưng tôi hy vọng một người nào đó đã đi xuống con đường này và tìm thấy điểm ngọt ngào.

+4

DateJS có thể thích hợp ở đây, nhưng phải thừa nhận, thậm chí sau đó, nó không hoàn hảo. http://www.datejs.com/ –

+1

Expresssions thông thường? –

+0

@GrantH. Tôi nghĩ về date.js, nhưng như bạn đã nói, có vẻ như nó có những thiếu sót của nó. Đó có thể là cách tôi sẽ đi - có lẽ trong sự kết hợp với các biểu thức thông thường - nếu tôi không nhận được gợi ý tốt hơn ở đây. –

Trả lời

5

Datejs có vẻ khá mạnh mẽ đối với tôi. chức năng parse nó hỗ trợ hơn 150 nền văn hóa:

Date.parse("February 20th 1973") 

Và trong trường hợp bạn cần phải phân tích một chuỗi ngày đó không có giá trị trong văn hóa hiện tại bạn có thể sử dụng parseExact chức năng:

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

Bạn đã thử truyền chuỗi của bạn vào hàm tạo chưa?

Dưới đây là một mẫu từ https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

var birthday = new Date("December 17, 1995 03:24:00"); 
+1

Đó là những gì jquery.validate đã làm, tôi tin (xem mã trong OP của tôi). Đây là một trong những cho phép một ngày điên rồ, nhưng không cho phép ngày chỉ đơn giản là chính xác (với dấu gạch nối). –

1

Thay vì cố gắng tìm thấy hai triển khai Datetime (một cho JS và một cho C#) có xác nhận và phân tích cú pháp tương tự, có bạn coi là có những khách hàng 1) sử dụng của nó thư viện riêng để xác nhận ngày và 2) phân tích cú pháp và định dạng lại ngày thành định dạng thân thiện với C#?

Điều này sẽ cho phép bạn sử dụng DateJS để có được giao diện người dùng linh hoạt cho đầu vào ngày, giúp dễ dàng xử lý văn bản phía khách hàng hơn và cho phép phía máy chủ của bạn xử lý định dạng cố định.

2

Trong tất cả sự trung thực, đặt cược tốt nhất của bạn là thực hiện một hit AJAX và yêu cầu máy chủ web ASP.net của bạn phân tích cú pháp chuỗi và trả về một ngày Javascript.

Thư viện Javascript dễ bị nhầm lẫn với các ngôn ngữ khác nhau, ví dụ::

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

nào được thực sự phức tạp vì:

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

Khung NET, với Windows đằng sau nó, đã hỗ trợ cho rất nhiều địa phương khác nhau.

Các vấn đề liên quan