Đã cập nhật
Chúng tôi có một thư viện UI nội bộ phải đối phó với cả định dạng JSON tích hợp ASP.NET của Microsoft, như /Date(msecs)/
, được hỏi về đây ban đầu và hầu hết định dạng ngày của JSON bao gồm cả JSON.NET, như thế nào 2014-06-22T00:00:00.0
. Ngoài ra, chúng ta cần đối phó với sự bất lực của oldIE để đối phó với bất cứ điều gì ngoại trừ 3 chữ số thập phân .
Trước tiên, chúng tôi phát hiện loại ngày chúng tôi đang tiêu thụ, phân tích nó thành một Date
đối tượng JavaScript bình thường , sau đó định dạng ra ngày đó.
1) Phát hiện định dạng Ngày của Microsoft
// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
return /^\/Date\(/.test(s);
}
2) Phát hiện định dạng ngày ISO
var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;
function looksLikeIsoDate(s) {
return isoDateRegex.test(s);
}
3) Định dạng ngày phân tích MS:
function parseMSDate(s) {
// Jump forward past the /Date(, parseInt handles the rest
return new Date(parseInt(s.substr(6)));
}
4) Phân tích định dạng ngày ISO.
Chúng tôi ít nhất có một cách để chắc chắn rằng chúng tôi đang xử lý các ngày ISO tiêu chuẩn hoặc các ngày ISO được sửa đổi để luôn có ba vị trí mili giây ( xem ở trên ), vì vậy mã khác nhau tùy thuộc vào môi trường.
4a) Phân tích định dạng Ngày ISO tiêu chuẩn, đối phó với các vấn đề của oldIE:
function parseIsoDate(s) {
var m = isoDateRegex.exec(s);
// Is this UTC, offset, or undefined? Treat undefined as UTC.
if (m.length == 7 || // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
(m.length > 7 && (
!m[7] || // Array came back length 9 with undefined for 7 and 8
m[7].charAt(0) != '.' || // ms portion, no tz offset, or no ms portion, Z
!m[8] || // ms portion, no tz offset
m[8] == 'Z'))) { // ms portion and Z
// JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
} else {
// local
var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
}
return d;
}
4b) Phân tích định dạng ISO với vị trí thập phân ba phần nghìn giây cố định - dễ dàng hơn nhiều:
function parseIsoDate(s) {
return new Date(s);
}
5) Định dạng nó:
function hasTime(d) {
return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}
function zeroFill(n) {
if ((n + '').length == 1)
return '0' + n;
return n;
}
function formatDate(d) {
if (hasTime(d)) {
var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
} else {
var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
}
return s;
}
6) Buộc tất cả lại với nhau:
function parseDate(s) {
var d;
if (looksLikeMSDate(s))
d = parseMSDate(s);
else if (looksLikeIsoDate(s))
d = parseIsoDate(s);
else
return null;
return formatDate(d);
}
Câu trả lời cũ dưới đây rất hữu ích cho việc định dạng ngày này vào phân tích cú pháp JSON của riêng jQuery để bạn có được các đối tượng Date thay vì chuỗi hoặc nếu bạn vẫn bị mắc kẹt trong jQuery <1.5.
Câu trả lời cũ
Nếu bạn đang sử dụng hàm Ajax của jQuery 1.4 với ASP.NET MVC, bạn có thể biến tất cả các thuộc tính DateTime thành các đối tượng Date bằng:
// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
$.ajax({
...
dataFilter: function(d) {
return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
},
...
});
Trong jQuery 1.5, bạn có thể tránh ghi đè parseJSON
phương thức trên toàn cầu bằng cách sử dụng tùy chọn trình chuyển đổi trong lệnh gọi Ajax.
http://api.jquery.com/jQuery.ajax/
Thật không may, bạn phải chuyển sang tuyến eval cũ hơn để có được Ngày phân tích tại chỗ trên toàn cầu - nếu không, bạn cần phải chuyển đổi chúng theo từng phân tích theo từng trường hợp cụ thể.