Làm cách nào để định dạng ngày Microsoft JSON?


2000

Tôi đang dùng bản crack đầu tiên của mình tại Ajax với jQuery. Tôi đang nhận dữ liệu của mình trên trang của mình, nhưng tôi gặp một số rắc rối với dữ liệu JSON được trả về cho các loại dữ liệu Ngày. Về cơ bản, tôi nhận được một chuỗi trở lại trông như thế này:

/Date(1224043200000)/

Từ một người hoàn toàn mới đối với JSON - Làm cách nào để định dạng này thành định dạng ngày ngắn? Điều này có nên được xử lý ở đâu đó trong mã jQuery không? Tôi đã thử dùng jQuery.UI.datepickerplugin $.datepicker.formatDate()mà không thành công.

FYI: Đây là giải pháp tôi đã đưa ra bằng cách sử dụng kết hợp các câu trả lời ở đây:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

Giải pháp này có đối tượng của tôi từ phương thức gọi lại và hiển thị đúng ngày trên trang bằng thư viện định dạng ngày.


26
Điều này có thể thú vị: hanselman.com/blog/ từ
citronas

6
Định dạng /Date(...)/ dành riêng cho định dạng Ngày JSON tích hợp của Microsoft - nó không phải là một phần của bất kỳ tiêu chuẩn nào và JSON, đến từ Javascript, có một tiêu chuẩn: Định dạng ISO Javascript chỉ định: stackoverflow.com/a / 15952652/177777 Vì vậy, câu hỏi này dành riêng cho định dạng Ngày JSON của Microsoft. Tôi đã sửa đổi tiêu đề để làm rõ điều này.
Chris Moschini

15
Bạn đang đùa! Microsoft đã đóng dấu spin của riêng họ trên JSON! và vào những ngày !! Khi nào họ sẽ học!
Nick.McDilyn

Sử dụng Newtonsoft JSON ở phía .NET và để có các giá trị được nhập tốt ở phía JS, chỉ cần sử dụng: github.com/RickStrahl/json.date-extensions
baHI

Bạn có thể sử dụng JSON ++ thay vì JSON. JSON ++ giống với JSON nhưng có hỗ trợ các loại JavaScript như Date.
sáng

Câu trả lời:


1688

eval()không cần thiết. Điều này sẽ hoạt động tốt:

var date = new Date(parseInt(jsonDate.substr(6)));

Các substr()chức năng sẽ đưa ra các /Date(phần, và các parseInt()chức năng nhận được số nguyên và bỏ qua )/ở cuối. Số kết quả được truyền vào hàm Datetạo.


Tôi đã cố tình bỏ đi cơ số (đối số thứ 2 parseInt); xem bình luận của tôi dưới đây .

Ngoài ra, tôi hoàn toàn đồng ý với nhận xét của Rory : ngày ISO-8601 được ưa thích hơn định dạng cũ này - vì vậy định dạng này thường không nên được sử dụng cho phát triển mới. Xem thư viện Json.NET tuyệt vời để biết một giải pháp thay thế tuyệt vời nối tiếp ngày tháng bằng định dạng ISO-8601.

Đối với các ngày JSON được định dạng ISO-8601, chỉ cần chuyển chuỗi vào hàm Datetạo:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

4
@Broam: Cả hai phương thức (chức năng thay thế và câu trả lời này) sẽ phải thay đổi nếu MS thay đổi định dạng.
Roy Tinker

23
Bạn có thể vui lòng cập nhật nó với radix var date = new Date (parseInt (jsonDate.substr (6), 10));
James Kyburz

6
@JamesKyburz: Mọi quy tắc đều có ngoại lệ và tôi nghĩ đây là khi một ngoại lệ được áp dụng. Các số ngày JSON từ .NET không bao giờ có số "0" hàng đầu, vì vậy chúng ta có thể bỏ qua cơ số một cách an toàn.
Roy Tinker

22
Điều đáng chú ý là định dạng ngày này khá tệ và di chuyển chung là ngày định dạng ISO-8601 trong JSON. Xem hanselman.com/blog/ từ
Rory

4
Cách tiếp cận này không xem xét múi giờ nên có thể gây ra sự cố nghiêm trọng khi máy chủ và người dùng của bạn ở các múi giờ khác nhau. Tôi đã đăng một câu trả lời dưới đây giải thích một cách rất nhanh chóng và dễ dàng để giải quyết nó trên các mặt WCF và Javascript: stackoverflow.com/a/10743718/51061
Scott Willeke

135

Bạn có thể sử dụng điều này để có được một ngày từ JSON:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

Và sau đó, bạn có thể sử dụng tập lệnh Định dạng ngày JavaScript (1,2 KB khi được rút gọn và nén) để hiển thị nó theo ý muốn.


7
Không có gì sai với dòng, chuỗi là \ //. Dấu gạch chéo đầu tiên được thoát ra để nó không được tính như một bình luận. Đó là trình soạn thảo của bạn đánh lừa bạn, dòng sẽ hoạt động tốt.
andreialecu

152
@rball, vô nghĩa:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
mí mắt

39
pst đã đúng, có thể làm điều này bằng nhiều cách khác nhau mà không cần 'eval'. Crockford nói rằng 'eval Is Evil' vì nó ít đọc và kém an toàn hơn, ngoài ra anh ta còn có thể ám chỉ rằng nó kém hiệu quả và nguy hiểm hơn vì nó tấn công trình biên dịch javascript.
Mark Rogers

13
@Edy: new Functiongần như tệ như eval: dev.opera.com/articles/view/ffic-javascript/iêu
Marcel Korpel

5
@Edy: Đó là một hình thức khác của eval, và cũng giống như 'ác quỷ'. Thay vào đó, phân tích chuỗi (xem câu trả lời của tôi bên dưới)
Roy Tinker

98

Đối với những người sử dụng Newtonsoft Json.NET , hãy đọc cách thực hiện thông qua JSON gốc trong IE8, Firefox 3.5 cộng với Json.NET .

Ngoài ra tài liệu về việc thay đổi định dạng ngày được viết bởi Json.NET rất hữu ích: Nối tiếp ngày với Json.NET

Đối với những người quá lười biếng, đây là các bước nhanh chóng. Vì JSON có triển khai DateTime lỏng lẻo, bạn cần sử dụng IsoDateTimeConverter(). Lưu ý rằng vì Json.NET 4.5 định dạng ngày mặc định là ISO nên mã dưới đây không cần thiết.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

JSON sẽ đi qua như

"fieldName": "2009-04-12T20:44:55"

Cuối cùng, một số JavaScript để chuyển đổi ngày ISO thành ngày JavaScript:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

Tôi đã sử dụng nó như thế này

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);

6
Trình xây dựng ngày JavaScript có thể phân tích chuỗi cho bạn:new Date("2009-04-12T20:44:55")
David Hogue

5
Cảnh báo - Các định dạng và phân tích cú pháp của Trình xây dựng ngày () là không chuẩn trước ECMAScript 6. Ví dụ: IE 9 coi ngày bạn cung cấp cho nhà xây dựng là giờ địa phương ngay cả khi nó ở IS0-8601, được ngụ ý là UCT ở mọi nơi khác. Đừng dựa vào hàm tạo ngày nếu bạn hỗ trợ các trình duyệt cũ hơn. codeofmatt.com/2013/06/07/ từ
DanO

Gửi ngày không phải UTC sẽ sớm muộn cũng khiến bạn gặp rắc rối.
tymtam

Một chút muộn cho bữa tiệc ở đây, nhưng những gì sẽ (+ a [1], + a [2] - 1, + a [3], + a [4], + a [5], + a [6]) ; đại diện trong bối cảnh này?
ngày

@yanant - +a[1]v.v ... đại diện cho các mảng của regex và +sẽ chuyển nó thành một số, vì vậy +a[1]bằng, 2009v.v ... Đây là phân tích mảng: 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Jason Jong

67

Ví dụ ban đầu:

/Date(1224043200000)/  

không phản ánh định dạng được WCF sử dụng khi gửi ngày qua WCF REST bằng cách sử dụng tuần tự hóa JSON tích hợp. (ít nhất là trên .NET 3.5, SP1)

Tôi thấy câu trả lời ở đây rất hữu ích, nhưng cần phải chỉnh sửa một chút cho biểu thức chính quy, vì có vẻ như phần bù GMT múi giờ đang được thêm vào số được trả về (từ năm 1970) trong WCF JSON.

Trong dịch vụ WCF tôi có:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

ApptVisitLinkInfo được định nghĩa đơn giản:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

Khi "Field2" được trả về là Json từ dịch vụ, giá trị là:

/Date(1224043200000-0600)/

Lưu ý phần bù múi giờ được bao gồm như một phần của giá trị.

Regex sửa đổi:

/\/Date\((.*?)\)\//gi

Nó háo hức hơn một chút và nắm lấy mọi thứ giữa các parens, không chỉ là số đầu tiên. Thời gian kết quả là năm 1970, cộng với việc bù múi giờ tất cả có thể được đưa vào eval để lấy đối tượng ngày.

Dòng kết quả của JavaScript để thay thế là:

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");

10
Điều này là sai, Ngày mới (1224043200000-0600) sẽ chỉ trừ 600 từ ngày, trong trường hợp này là 600 triệu giây chứ không phải 6 giờ như bình thường.
ariel


Tôi nghĩ rằng phần bù múi giờ chỉ được bao gồm nếu bạn có múi giờ trên đối tượng DateTime trong .NET (đó là hành vi mặc định). Nếu ngày của bạn là UTC, hãy sử dụng DateTime.SpecifyKind (ngày, DateTimeKind.UTC) và bạn sẽ nhận được giá trị UTC phù hợp khi nó tuần tự hóa, không có bù, sau đó bạn có thể chuyển đổi trở lại múi giờ của người dùng nếu cần. Nếu đó là giờ địa phương, hãy sử dụng .ToUniversalTime () và nó sẽ chuyển đổi thành UTC và có "Loại" đã được chỉ định cho bạn.
jvenema

trong javascript -0100 sẽ là một chuỗi nhị phân, vì vậy hãy cẩn thận!
verbedr

một khi bạn đã có ngày chuyển đổi từ WCF sang JS, thì ngược lại. Bạn phải ghi ngày dưới dạng số nguyên (sử dụng date.getTime ()) mà bạn muốn chuyển đến cùng WCF?
NitinSingh

65

Đừng lặp lại chính mình - tự động chuyển đổi ngày bằng cách sử dụng $.parseJSON()

Câu trả lời cho bài đăng của bạn cung cấp chuyển đổi ngày thủ công sang ngày JavaScript. Tôi đã mở rộng jQuery $.parseJSON()chỉ một chút, vì vậy nó có thể tự động phân tích ngày khi bạn hướng dẫn. Nó xử lý ngày định dạng ASP.NET ( /Date(12348721342)/) cũng như ngày được định dạng ISO ( 2010-01-01T12.34.56.789Z) được hỗ trợ bởi các hàm JSON gốc trong các trình duyệt (và các thư viện như json2.js).

Dù sao. Nếu bạn không muốn lặp đi lặp lại mã chuyển đổi ngày của mình, tôi khuyên bạn nên đọc bài đăng trên blog này và nhận mã sẽ giúp cuộc sống của bạn dễ dàng hơn một chút.


61

Nếu bạn nói bằng JavaScript,

var thedate = new Date(1224043200000);
alert(thedate);

bạn sẽ thấy đó là ngày chính xác và bạn có thể sử dụng bất kỳ nơi nào trong mã JavaScript với bất kỳ khung nào.


3
Đó cũng là những gì tôi đã nghĩ, ngoại trừ kết thúc là: var thedate = / Date (1224043200000) /; ít nhất là đối với tôi ...
rball

2
Ngày () và Ngày (1224043200000) đều cho cùng một kết quả trong cả Chrome và Firefox. Không chắc chắn nếu điều này làm việc trong các trình duyệt cũ, nhưng câu trả lời này không hoạt động trong các trình duyệt bây giờ.
James

@James, vâng, nó đang cung cấp cho trình duyệt ngày hiện tại. :(
vissu

9
Bạn cần viết nó là "Ngày mới (1224043200000)".
BrainSlugs83

60

Nhấn vào đây để kiểm tra bản Demo

JavaScript / jQuery

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

Kết quả - "15/10/2008"


Chỉ là một cải tiến cho phương pháp trên. function formatearFecha (fec) {var value = new Date (parseInt (fec.replace (/ (^. * () | ([+ -]. * $) / g, ''))); var mes = value.getMonth (); var dia = value.getDate (); var date = dia + "/" + mes + "/" + value.getFullYear (); if (dia <10) date = date.substr (0, 0) + '0' + dia + date.substr (1); if (mes <10) date = date.substr (0, 3) + '0' + mes + date.substr (4); ngày trả về;} ngày được định dạng thành ddMMyyyy. Chúc mừng!
Matias

38

Đã 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 đè parseJSONphươ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ể.


27

Không có kiểu ngày tháng được xây dựng trong JSON . Điều này trông giống như số giây / mili giây từ một số kỷ nguyên. Nếu bạn biết kỷ nguyên, bạn có thể tạo ngày bằng cách thêm vào đúng thời gian.


Điều đó không chính xác, JSON sử dụng ngày Javascript, với thông tin múi giờ được thêm vào - epoch giống như epoch của lớp javascript (vì lý do rõ ràng).
BrainSlugs83

3
@ BrainSlug83 - câu trả lời này cung cấp một tài liệu tham khảo cho khẳng định rằng JSON không có kiểu ngày dựng sẵn. Nếu bạn không đồng ý, vui lòng cung cấp một tài liệu tham khảo thay thế. (Bạn không nghĩ đến một khung cụ thể đã quyết định định dạng chuỗi để biểu thị ngày là bạn phải không? Đó không phải là một phần của tiêu chuẩn JSON, thực sự không thể vì nó không thể bao gồm một chuỗi không phải là được coi là một ngày nhưng điều đó xảy ra có một tập hợp các ký tự khớp với mẫu ngày.)
nnnnnn

25

Tôi cũng đã phải tìm kiếm một giải pháp cho vấn đề này và cuối cùng tôi đã tìm thấy khoảnh khắc đó là một thư viện đẹp có thể phân tích định dạng ngày này và nhiều hơn nữa.

var d = moment(yourdatestring)

Nó đã cứu tôi một số vấn đề đau đầu vì vậy tôi nghĩ rằng tôi muốn chia sẻ nó với bạn. :)
Bạn có thể tìm thêm một số thông tin về nó ở đây: http://momentjs.com/


24

Cuối cùng tôi đã thêm "các ký tự vào biểu thức chính quy của Panos để loại bỏ các ký tự được tạo bởi bộ nối tiếp Microsoft để viết các đối tượng vào một tập lệnh nội tuyến:

Vì vậy, nếu bạn có một tài sản trong C # của bạn - đằng sau đó là một cái gì đó như

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

Và trong aspx của bạn, bạn có

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

Bạn sẽ nhận được một cái gì đó như

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

Chú ý dấu ngoặc kép.

Để có được điều này thành một hình thức mà eval sẽ khử lưu chính xác, tôi đã sử dụng:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

Tôi sử dụng Prototype và để sử dụng nó tôi đã thêm

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}

22

Trong jQuery 1.5, miễn là bạn có json2.js để trình bày cho các trình duyệt cũ hơn, bạn có thể giải tuần tự hóa tất cả các ngày đến từ Ajax như sau:

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

Tôi bao gồm logic giả định rằng bạn gửi tất cả các ngày từ máy chủ là UTC (mà bạn nên); người tiêu dùng sau đó nhận được một Dateđối tượng JavaScript có giá trị tick phù hợp để phản ánh điều này. Nghĩa là, gọi getUTCHours(), v.v. vào ngày sẽ trả về cùng giá trị như đã thực hiện trên máy chủ và gọi getHours()sẽ trả về giá trị trong múi giờ địa phương của người dùng như được xác định bởi trình duyệt của họ.

Điều này không tính đến định dạng WCF với độ lệch múi giờ, mặc dù điều đó sẽ tương đối dễ dàng để thêm.


Cũng như một lưu ý: để mã hoạt động, bạn phải tạo phương thức startedWith của loại chuỗi
Hugo Zapata

21

Sử dụng công cụ cập nhật giao diện người dùng jQuery - thực sự chỉ có ý nghĩa nếu bạn đã bao gồm Giao diện người dùng jQuery:

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 

đầu ra:

Ngày 15 tháng 10 năm 2008


20

Đừng nghĩ quá nhiều về điều này. Giống như chúng ta đã thực hiện trong nhiều thập kỷ, vượt qua một số bù từ kỷ nguyên tiêu chuẩn thực tế là ngày 1 tháng 1 năm 1970 nửa đêm GMT / UTC / & c tính bằng số giây (hoặc mili giây) kể từ kỷ nguyên này. JavaScript thích nó, Java thích nó, C thích nó và Internet thích nó.


2
Và quá tệ, có hơn 20 kỷ nguyên để lựa chọn. vi.wikipedia.org/wiki/Epoch_(reference_date)
Jerther


18

Tất cả mọi người trong số những câu trả lời này đều có một điểm chung: tất cả đều lưu trữ ngày dưới dạng một giá trị (thường là một chuỗi).

Một tùy chọn khác là tận dụng cấu trúc vốn có của JSON và biểu thị một ngày dưới dạng danh sách các số:

{ "name":"Nick",
  "birthdate":[1968,6,9] }

Tất nhiên, bạn sẽ phải đảm bảo cả hai đầu của cuộc trò chuyện đồng ý về định dạng (năm, tháng, ngày) và trường nào có nghĩa là ngày, ... nhưng nó có lợi thế là tránh hoàn toàn vấn đề về ngày chuyển đổi -to-chuỗi. Đó là tất cả các số - không có chuỗi nào cả. Ngoài ra, sử dụng thứ tự: năm, tháng, ngày cũng cho phép sắp xếp hợp lý theo ngày.

Chỉ cần suy nghĩ bên ngoài hộp ở đây - một ngày JSON không phải được lưu trữ dưới dạng một chuỗi.

Một phần thưởng khác khi thực hiện theo cách này là bạn có thể dễ dàng (và hiệu quả) chọn tất cả các bản ghi cho một năm hoặc tháng nhất định bằng cách tận dụng cách CouchDB xử lý các truy vấn trên các giá trị mảng.


một định dạng chuẩn cho những ngày trong JSON, đó là định dạng RFC 3339.
gnasher729

@gnasher, điều đó sẽ tốt, nhưng không phải vậy. Không có tài liệu tham khảo từ RFC 7159 đến 3339 hoặc ngược lại. Không có định dạng ngày JSON tiêu chuẩn de jure . Tất cả những gì còn lại là các tiêu chuẩn thực tế , mỗi tiêu chuẩn đều có ưu / nhược điểm. Đó là điều tốt đẹp về tiêu chuẩn.
Marc L.

17

Đăng trong chủ đề tuyệt vời:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));

1
Ý tưởng hay, nhưng nếu bao gồm bù thời gian thì sao? Tốt hơn là sử dụng chất nền (6) trong trường hợp đó thay vì lát (6, -2) - xem câu trả lời của tôi dưới đây.
Roy Tinker

17

Chỉ cần thêm một cách tiếp cận khác ở đây, "cách tiếp cận tích tắc" mà WCF thực hiện có xu hướng gặp vấn đề với múi giờ nếu bạn không cực kỳ cẩn thận như được mô tả ở đây và ở những nơi khác. Vì vậy, bây giờ tôi đang sử dụng định dạng ISO 8601 mà cả .NET & JavaScript hỗ trợ hợp lệ bao gồm các độ lệch múi giờ. Dưới đây là chi tiết:

Trong WCF / .NET:

Trong đó CreationDate là System.DateTime; ToString ("o") đang sử dụng công cụ xác định định dạng Chuyến đi khứ hồi của .NET để tạo chuỗi ngày tuân thủ ISO 8601

new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};

Trong JavaScript

Ngay sau khi lấy JSON, tôi sửa các ngày thành các đối tượng Ngày của JavaSript bằng cách sử dụng hàm tạo Ngày chấp nhận chuỗi ngày ISO 8601 ...

$.getJSON(
    "MyRestService.svc/myinfo",
    function (data) {
        $.each(data.myinfos, function (r) {
            this.CreatedOn = new Date(this.CreationDate);
        });
        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
       alert(data.myinfos[0].CreationDate.toLocaleString());
    }
)

Khi bạn có một ngày JavaScript, bạn có thể sử dụng tất cả các phương thức Ngày thuận tiện và đáng tin cậy như toDateString , toLocaleString , v.v.


16
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

Có tùy chọn nào khác mà không sử dụng thư viện jQuery không?


Đây là một câu hỏi mới và nên được hỏi như câu hỏi của chính nó và không được nhúng ở đây.
Spencer Sullivan

11

Điều này cũng có thể giúp bạn.

 function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Date
        var pattern = /Date\(([^)]+)\)/;
        var results = pattern.exec(value);
        var dt = new Date(parseFloat(results[1]));
        return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
    }

10

Dưới đây là một giải pháp khá đơn giản để phân tích ngày JSON. Sử dụng các chức năng dưới đây theo yêu cầu của bạn. Bạn chỉ cần chuyển định dạng JSON Ngày tìm nạp dưới dạng tham số cho các hàm bên dưới:

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}

10

Bạn cũng có thể sử dụng thư viện JavaScript khoảnh khắc , rất hữu ích khi bạn lên kế hoạch xử lý các định dạng cục bộ khác nhau và thực hiện các hoạt động khác với giá trị ngày:

function getMismatch(id) {
    $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

Thiết lập nội địa hóa dễ dàng như thêm các tệp cấu hình (bạn có được chúng tại khoảnh khắcjs.com) vào dự án của bạn và định cấu hình ngôn ngữ:

moment.lang('de');

9

Tôi có được ngày như thế này:

"/Date(1276290000000+0300)/"

Trong một số ví dụ, ngày ở các định dạng hơi khác nhau:

"/Date(12762900000000300)/"
"Date(1276290000000-0300)"

Vân vân.

Vì vậy, tôi đã đưa ra RegExp sau:

/\/+Date\(([\d+]+)\)\/+/

và mã cuối cùng là:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));

Hy vọng nó giúp.

Cập nhật: Tôi tìm thấy liên kết này từ Microsoft: Làm cách nào để tôi nối tiếp các ngày với JSON?

Điều này có vẻ như một trong tất cả chúng ta đang tìm kiếm.


1
Việc thay thế Regrec bị chậm ... Sẽ nhanh hơn nhiều khi lấy phần nguyên bằng cách sử dụng chất nền (6) và chuyển nó sang parseInt () - xem câu trả lời của tôi dưới đây.
Roy Tinker


9

Kiểm tra tiêu chuẩn ISO ngày; đại loại như thế này:

yyyy.MM.ddThh:mm

Nó trở thành 2008.11.20T22:18.


Theo Lược đồ JSON, định dạng "ngày giờ" tương ứng với RFC 3339, phần 5.6. Vì vậy, bạn nên viết "yyyy-MM-ddTHH: mm: ssZ" cho các ngày theo GMT hoặc Z thay thế bằng múi giờ như + hh: mm.
gnasher729

Vấn đề là WCF và tuần tự MS JSON "cũ" khác không sử dụng định dạng này và điều đó phải được tính đến.
Marc L.

9

Điều này thật khó chịu. Giải pháp của tôi là phân tích "/ và /" từ giá trị được tạo bởi JavaScriptSerializer của ASP.NET để mặc dù JSON có thể không có nghĩa đen theo ngày, nhưng nó vẫn được trình duyệt hiểu là một ngày, đó là tất cả những gì tôi thực sự hiểu muốn:{"myDate":Date(123456789)}

JavaScriptConverter tùy chỉnh cho DateTime?

Tôi phải nhấn mạnh tính chính xác của nhận xét của Roy Tinker. Đây không phải là JSON hợp pháp. Đó là một bản hack bẩn, bẩn trên máy chủ để loại bỏ sự cố trước khi nó trở thành vấn đề đối với JavaScript. Nó sẽ bóp nghẹt một trình phân tích cú pháp JSON. Tôi đã sử dụng nó để lên khỏi mặt đất, nhưng tôi không sử dụng nó nữa. Tuy nhiên, tôi vẫn cảm thấy câu trả lời tốt nhất nằm ở việc thay đổi cách máy chủ định dạng ngày, ví dụ, ISO như được đề cập ở nơi khác.


2
Đó không phải là JSON hợp pháp. Nó sẽ chỉ hoạt động khi đánh giá với trình thông dịch Javascript. Nhưng nếu bạn đang sử dụng bộ giải mã JSON, nó sẽ bị sặc.
Roy Tinker

1
Đã đồng ý. Và nếu tôi chỉ xử lý một phần dữ liệu này, tôi sẽ không xem xét nó. Nhưng nếu tôi đang xử lý một đối tượng của một số ngày và các thuộc tính khác, thì sẽ dễ dàng đánh giá () toàn bộ hơn là chọn ra các thuộc tính một lần. Cuối cùng, vấn đề gốc là thiếu ngày JSON (hợp pháp). Cho đến khi điều đó tồn tại, chúng ta chỉ còn lại những bản hack sáng tạo của chúng ta.
StarTrekRedneck

8

Một bài viết muộn, nhưng cho những người tìm kiếm bài đăng này.

Hãy tưởng tượng điều này:

    [Authorize(Roles = "Administrator")]
    [Authorize(Roles = "Director")]
    [Authorize(Roles = "Human Resources")]
    [HttpGet]
    public ActionResult GetUserData(string UserIdGuidKey)
    {
        if (UserIdGuidKey!= null)
        {
            var guidUserId = new Guid(UserIdGuidKey);
            var memuser = Membership.GetUser(guidUserId);
            var profileuser = Profile.GetUserProfile(memuser.UserName);
            var list = new {
                              UserName = memuser.UserName,
                              Email = memuser.Email ,
                              IsApproved = memuser.IsApproved.ToString() ,
                              IsLockedOut = memuser.IsLockedOut.ToString() ,
                              LastLockoutDate = memuser.LastLockoutDate.ToString() ,
                              CreationDate = memuser.CreationDate.ToString() ,
                              LastLoginDate = memuser.LastLoginDate.ToString() ,
                              LastActivityDate = memuser.LastActivityDate.ToString() ,
                              LastPasswordChangedDate = memuser.LastPasswordChangedDate.ToString() ,
                              IsOnline = memuser.IsOnline.ToString() ,
                              FirstName = profileuser.FirstName ,
                              LastName = profileuser.LastName ,
                              NickName = profileuser.NickName ,
                              BirthDate = profileuser.BirthDate.ToString() ,
            };
            return Json(list, JsonRequestBehavior.AllowGet);
        }
        return Redirect("Index");
    }

Như bạn có thể thấy, tôi đang sử dụng tính năng của C # 3.0 để tạo Generics "Tự động". Đó là một chút lười biếng, nhưng tôi thích nó và nó hoạt động. Chỉ cần một lưu ý: Hồ sơ là một lớp tùy chỉnh tôi đã tạo cho dự án ứng dụng web của mình.


vì vậy mỗi khi bạn thêm một vai trò mới [Ủy quyền (Vai trò = "Nhân sự")], bạn có phải biên dịch và triển khai không? wow .... :)
Alex Nolasco

1
Nếu đây là một dịch vụ JSON thì chuyển hướng có vẻ sai. Tôi sẽ trả lại 404 Không tìm thấy nếu khóa đầu vào không hợp lệ, không thể tìm thấy (và cả 404 nếu không tìm thấy nó thực sự). Khi người dùng của tôi chưa đăng nhập, tôi trả lại 403 Bị cấm.
Richard Corfield

Đó là một phương pháp "tái sử dụng". Ví dụ: nếu tôi muốn lấy dữ liệu người dùng từ một Chế độ xem khác, tôi có thể lấy dữ liệu đó miễn là tôi cung cấp Id. Tuy nhiên, nếu Id không được cung cấp, trang sẽ chuyển hướng đến danh sách người dùng (Index) để chọn người dùng. Giải pháp đơn giản cần thiết cho ứng dụng, chỉ là cách não tôi nấu nó vào lúc đó.
Ray Linder

8

FYI, đối với bất kỳ ai sử dụng Python ở phía máy chủ: datetime.datetime (). Ctime () trả về một chuỗi có thể phân tích cú pháp theo "Ngày mới ()". Đó là, nếu bạn tạo một cá thể datetime.datetime mới (chẳng hạn như với datetime.datetime.now), chuỗi có thể được bao gồm trong chuỗi JSON, và sau đó chuỗi đó có thể được chuyển làm đối số đầu tiên cho hàm tạo Ngày. Tôi chưa tìm thấy bất kỳ trường hợp ngoại lệ nào, nhưng tôi cũng chưa kiểm tra nó quá nghiêm ngặt.


8

Dung dịch Mootool:

new Date(Date(result.AppendDts)).format('%x')

Yêu cầu mootools-more. Đã thử nghiệm bằng mootools-1.2.3.1 trở lên trên Firefox 3.6.3 và IE 7.0.5730.13


8
var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];

8

Thêm plugin jQuery UI trong trang của bạn:

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};

8

Nếu .NET trả về ...

return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"

Và sau đó trong JavaScript ...

var x = new Date("2013-09-17 15:18:53Z");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.