Thực tế có thể sửa đổi cách đối tượng Ngày sẽ được tuần tự hóa thành JSON. Kết hợp với chức năng hồi sinh, một giải pháp hai hướng có thể được tạo ra sẽ tự động làm việc trên serialization và có thể dễ dàng được sử dụng trên deserialization.
Đầu tiên thay đổi tuần tự như thế này:
Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }
này sẽ thay đổi đại diện của một đối tượng Date thành một dấu thời gian UNIX với một tiền tố là một dấu hiệu:
> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"
Sau đó, bạn có thể tạo một chức năng khôi phục sẽ tự động lọc ra các giá trị sau:
function json_deserialize_helper(key,value) {
if (typeof value === 'string') {
var regexp;
regexp = /^{timestamp}(\d*)$/.exec(value);
if (regexp) {
return new Date(+regexp[1]);
}
}
return value;
}
(Tín dụng : Mã này đã được cơ bản sao chép từ câu trả lời này trong một câu hỏi liên quan: https://stackoverflow.com/a/14509447/2572897)
Bây giờ với thiết lập này, deserialization kết quả của chúng tôi từ trước sẽ cho kết quả trong một đối tượng ngày một lần nữa:
> JSON.parse(json, json_deserialize_helper);
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)}
Hoặc bạn có thể chọn không điều chỉnh serialization nhưng thay vì sử dụng regexp để bắt các định dạng serialization tiêu chuẩn:
function json_deserialize_helper(key,value) {
if (typeof value === 'string') {
var regexp;
regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value);
if (regexp) {
return new Date(value);
}
}
return value;
}
Ví dụ:
> json = JSON.stringify({test:new Date()})
"{"test":"2013-09-26T03:05:26.563Z"}"
> JSON.parse(json, json_deserialize_helper)
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)}
Có lẽ bạn đang sắp xếp các ngày này để lưu trữ chúng trong localStorage. Trong trường hợp đó, bạn có thể tránh aggro như thế này và tương tự bằng cách sử dụng một thư viện wrapper như rhaboo. –