Định dạng ngày ASP.NET MVC JsonResult


248

Tôi có một hành động điều khiển chỉ đơn giản là trả về một JsonResult cho mô hình của tôi. Vì vậy, trong phương pháp của tôi, tôi có một cái gì đó như sau:

return new JsonResult(myModel);

Điều này hoạt động tốt, ngoại trừ một vấn đề. Có một thuộc tính ngày trong mô hình và điều này dường như được trả về trong kết quả Json như vậy:

"\/Date(1239018869048)\/"

Làm thế nào tôi nên xử lý ngày để chúng được trả lại theo định dạng tôi yêu cầu? Hoặc làm thế nào để tôi xử lý định dạng này ở trên trong kịch bản?


Tôi đã đăng kết quả mạng json của mình cho cùng một vấn đề, nó chuyển đổi ngày thành định dạng iso làm cho nó dễ dàng hơn để làm việc với. stackoverflow.com/questions/15778599/ Mạnh
Kieran

Xin vui lòng nhìn vào liên kết dưới đây. Tiến thẳng. stackoverflow.com/a/60392503/5962626
Mohamedasiq

Câu trả lời:


195

Chỉ cần mở rộng câu trả lời của casperOne .

Thông số JSON không tính đến các giá trị Ngày. MS đã phải thực hiện một cuộc gọi và con đường họ chọn là khai thác một mẹo nhỏ trong cách biểu diễn chuỗi javascript: chuỗi ký tự "/" giống như "\ /" và một chuỗi ký tự sẽ không bao giờ được nối tiếp thành " \ / "(thậm chí" \ / "phải được ánh xạ tới" \\ / ").

Xem http://msdn.microsoft.com/en-us/l Library / bb299886.aspx # intro_to_json_topic2 để được giải thích rõ hơn (cuộn xuống "Từ JavaScript Literals sang JSON")

Một trong những điểm nhức nhối của JSON là thiếu ngày / giờ theo nghĩa đen. Nhiều người ngạc nhiên và thất vọng khi biết điều này khi lần đầu tiên gặp JSON. Giải thích đơn giản (an ủi hay không) cho việc không có chữ / ngày theo nghĩa đen là JavaScript không bao giờ có một: Sự hỗ trợ cho các giá trị ngày và thời gian trong JavaScript hoàn toàn được cung cấp thông qua đối tượng Date. Do đó, hầu hết các ứng dụng sử dụng JSON làm định dạng dữ liệu, thường có xu hướng sử dụng chuỗi hoặc số để biểu thị giá trị ngày và thời gian. Nếu một chuỗi được sử dụng, bạn thường có thể mong đợi nó ở định dạng ISO 8601. Thay vào đó, nếu một số được sử dụng, thì giá trị thường được sử dụng có nghĩa là số mili giây trong Thời gian phối hợp toàn cầu (UTC) kể từ epoch, trong đó epoch được xác định là nửa đêm ngày 1 tháng 1 năm 1970 (UTC). Lần nữa, đây chỉ là quy ước và không phải là một phần của tiêu chuẩn JSON. Nếu bạn đang trao đổi dữ liệu với một ứng dụng khác, bạn sẽ cần kiểm tra tài liệu của nó để xem cách nó mã hóa các giá trị ngày và giờ trong một chữ JSON. Ví dụ, ASP.NET AJAX của Microsoft không sử dụng các quy ước được mô tả. Thay vào đó, nó mã hóa các giá trị .NET DateTime dưới dạng chuỗi JSON, trong đó nội dung của chuỗi là / Ngày (tick) / và trong đó tick đánh dấu mili giây kể từ epoch (UTC). Vì vậy, ngày 29 tháng 11 năm 1989, 4:55:30 sáng, trong UTC được mã hóa thành "\ / Ngày (628318530718) \ /". NET AJAX không sử dụng các quy ước được mô tả. Thay vào đó, nó mã hóa các giá trị .NET DateTime dưới dạng chuỗi JSON, trong đó nội dung của chuỗi là / Ngày (tick) / và trong đó tick đánh dấu mili giây kể từ epoch (UTC). Vì vậy, ngày 29 tháng 11 năm 1989, 4:55:30 sáng, trong UTC được mã hóa thành "\ / Ngày (628318530718) \ /". NET AJAX không sử dụng các quy ước được mô tả. Thay vào đó, nó mã hóa các giá trị .NET DateTime dưới dạng chuỗi JSON, trong đó nội dung của chuỗi là / Ngày (tick) / và trong đó tick đánh dấu mili giây kể từ epoch (UTC). Vì vậy, ngày 29 tháng 11 năm 1989, 4:55:30 sáng, trong UTC được mã hóa thành "\ / Ngày (628318530718) \ /".

Một giải pháp sẽ là phân tích nó ra:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));

Tuy nhiên, tôi đã nghe nói rằng có một cài đặt ở đâu đó để đưa serializer đến DateTimecác đối tượng đầu ra với new Date(xxx)cú pháp. Tôi sẽ cố gắng đào nó ra.


Tham số thứ hai của JSON.parse()chấp nhận một reviverhàm trong đó quy định giá trị ban đầu được tạo ra trước khi được trả về.

Đây là một ví dụ cho ngày:

var parsed = JSON.parse(data, function(key, value) {
  if (typeof value === 'string') {
    var d = /\/Date\((\d*)\)\//.exec(value);
    return (d) ? new Date(+d[1]) : value;
  }
  return value;
});

Xem tài liệu của JSON.parse ()


1
Cảm ơn, phân tích sẽ đi đâu mặc dù?
Jon Archway

Mã tôi đã đăng là JavaScript. Bạn sẽ đặt nó trong mã khách hàng của bạn.
JPot

6
Bạn có thể rút ngắn js thành Ngày mới (parseInt (dateString.replace (/ \ / Date \ ((\ d +) \) \ // gi, "$ 1")))
kͩeͣmͮpͥ

6
Trong thực tế, biểu thức chính xác hơn là thay thế (/ \ / Ngày \ ((-? \ D +) \) \ // gi, "$ 1") vì ngày cũng có thể được biểu thị dưới dạng số -ve
Dokie

1
@HarshilShah Đó là đối số thứ hai cho parseInt(). Nó cho biết hàm trích xuất một số nguyên trong hệ thống số 10 cơ sở. Đó là một cơ số. Nếu bạn đặt 8vào đó, nó sẽ trích xuất một số bát phân.
AnalogWeapon

99

Đây là giải pháp của tôi trong Javascript - rất giống với JPot, nhưng ngắn hơn (và có thể nhanh hơn một chút):

value = new Date(parseInt(value.substr(6)));

"Value.substr (6)" loại bỏ phần "/ Ngày (" và hàm parseInt bỏ qua các ký tự không có số xảy ra ở cuối.

EDIT: Tôi đã cố tình bỏ đi cơ số (đối số thứ 2 thành parseInt); xem bình luận của tôi dưới đây . Ngoài ra, xin lưu ý rằng 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 để phát triển mới. Xem thư viện Json.NET tuyệt vời để biết một sự 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 tạo Ngày:

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

1
+1 Tôi lấy giải pháp đơn giản của bạn và đưa nó vào hàm đệ quy. Xem tại đây: danielsadventure.info/dotnetdatetime
Sông Vivian

7
Bạn phải luôn chỉ định một cơ số khi sử dụng parseInt. [Nguồn]: developer.mozilla.org/en-US/docs/JavaScript/Reference/
mẹo

6
@JohnZabroski: Mọi quy tắc đều có ngoại lệ. Trình tuần tự hóa ngày .NET không bao giờ trả về số nguyên với các số 0 đứng đầu, vì vậy chúng ta có thể bỏ qua cơ số một cách an toàn.
Roy Tinker

4
Chúng tôi đã có gần như cùng một điều. Chúng tôi sử dụng value.substr(6, 13)để loại bỏ các ký tự không số khác. Nhưng nếu bạn làm điều đó, tất cả các ngày trước ngày 26 tháng 4 năm 1938 là không hợp lệ! Chúng tôi không biết parseIntsẽ bỏ qua các ký tự không số. Cảm ơn!
Ralph Jansen

2
@ JohnZabroski Hãy parseIntbỏ qua các số không hàng đầu kể từ ECMAScript ed 5 (2011).
RobG

69

Có khá nhiều câu trả lời để xử lý phía máy khách, nhưng bạn có thể thay đổi phía máy chủ đầu ra nếu muốn.

Có một vài cách để tiếp cận điều này, tôi sẽ bắt đầu với những điều cơ bản. Bạn sẽ phải phân lớp lớp JsonResult và ghi đè phương thức ExecuteResult. Từ đó bạn có thể thực hiện một vài cách tiếp cận khác nhau để thay đổi tuần tự hóa.

Cách tiếp cận 1: Việc triển khai mặc định sử dụng JsonScriptSerializer . Nếu bạn xem tài liệu này, bạn có thể sử dụng phương thức RegisterConverters để thêm JavaScriptConverters tùy chỉnh . Có một vài vấn đề với điều này: JavaScriptConverter được tuần tự hóa thành một từ điển, đó là nó lấy một đối tượng và tuần tự hóa thành một từ điển Json. Để làm cho đối tượng tuần tự hóa thành một chuỗi, nó đòi hỏi một chút hack, xem bài . Hack đặc biệt này cũng sẽ thoát khỏi chuỗi.

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Use your custom JavaScriptConverter subclass here.
            serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });

            response.Write(serializer.Serialize(Data));
        }
    }
}

Cách tiếp cận 2 (được khuyến nghị): Cách tiếp cận thứ hai là bắt đầu với JsonResult bị ghi đè và đi với một bộ nối tiếp Json khác, trong trường hợp của tôi là bộ nối tiếp Json.NET . Điều này không yêu cầu sự tấn công của phương pháp 1. Đây là cách triển khai lớp con JsonResult của tôi:

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            // Using Json.NET serializer
            var isoConvert = new IsoDateTimeConverter();
            isoConvert.DateTimeFormat = _dateFormat;
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }
}

Ví dụ sử dụng:

[HttpGet]
public ActionResult Index() {
    return new CustomJsonResult { Data = new { users=db.Users.ToList(); } };
}

Tín dụng bổ sung: James Newton-King


Và những gì về các định dạng khác như tiền tệ, số nhận dạng, điện thoại, vv? Không phải là một ứng dụng tốt hơn để có được các định dạng này từ ModelMetadata và sử dụng chúng để tuần tự hóa các Mô hình thành Json? Làm sao ?
Luciano

1
Đây là giải pháp tốt nhất (câu trả lời của Dave dễ hỏng). Máy chủ có trách nhiệm đưa ra định dạng ngày chính xác. Ngoài ra có một JsonResult tùy chỉnh mang lại nhiều lợi ích và kiểm soát hơn. Tôi sẽ đề nghị thực hiện một phương thức trợ giúp "CustomJson (dữ liệu)" để khởi tạo CustomJsonResult khi tồn tại "Json (dữ liệu)", giúp khởi tạo JsonResult với dữ liệu của nó.
thể thao

2
Một điều chỉnh cần thiết nếu bạn sử dụng một trong hai cách tiếp cận này - dòng đầu tiên phải là: private const string _dateFormat = "yyyy-MM-ddTHH: mm: ss"; Tôi đã thêm "T".
Dominick

31

Moment.js là một thư viện datetime rộng lớn cũng hỗ trợ điều này. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

ví dụ: khoảnh khắc ("/ Ngày (1198908717056-0700) /")

Nó sẽ giúp. đầu ra plunker


Tải xuống tập tin Moment.js đầu tiên. Thêm vào dự án của bạn hơn là sử dụng, moment("json_date_string_value").format('appropriate format'); bạn có thể thấy các giá trị định dạng khác nhau trên trang
momet.js

20

Tôi thấy rằng việc tạo ra một cái mới JsonResultvà trả lại là không thỏa đáng - phải thay thế tất cả các cuộc gọi đến return Json(obj)bằng return new MyJsonResult { Data = obj }một nỗi đau.


Vì vậy, tôi đã tìm ra, tại sao không chỉ chiếm quyền JsonResultsử dụng ActionFilter:

public class JsonNetFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is JsonResult == false)
        {
            return;
        }

        filterContext.Result = new JsonNetResult(
            (JsonResult)filterContext.Result);
    }

    private class JsonNetResult : JsonResult
    {
        public JsonNetResult(JsonResult jsonResult)
        {
            this.ContentEncoding = jsonResult.ContentEncoding;
            this.ContentType = jsonResult.ContentType;
            this.Data = jsonResult.Data;
            this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
            this.MaxJsonLength = jsonResult.MaxJsonLength;
            this.RecursionLimit = jsonResult.RecursionLimit;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var isMethodGet = string.Equals(
                context.HttpContext.Request.HttpMethod, 
                "GET", 
                StringComparison.OrdinalIgnoreCase);

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && isMethodGet)
            {
                throw new InvalidOperationException(
                    "GET not allowed! Change JsonRequestBehavior to AllowGet.");
            }

            var response = context.HttpContext.Response;

            response.ContentType = string.IsNullOrEmpty(this.ContentType) 
                ? "application/json" 
                : this.ContentType;

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
}

Điều này có thể được áp dụng cho bất kỳ phương thức nào trả về JsonResultviệc sử dụng JSON.Net thay thế:

[JsonNetFilter]
public ActionResult GetJson()
{
    return Json(new { hello = new Date(2015, 03, 09) }, JsonRequestBehavior.AllowGet)
}

cái nào sẽ đáp ứng với

{"hello":"2015-03-09T00:00:00+00:00"}

như mong muốn!


Bạn có thể, nếu bạn không ngại gọi isso sánh theo mọi yêu cầu, hãy thêm điều này vào FilterConfig:

// ...
filters.Add(new JsonNetFilterAttribute());

và tất cả JSON của bạn bây giờ sẽ được tuần tự hóa với JSON.Net thay vì tích hợp sẵn JavaScriptSerializer.


Đây là câu trả lời duy nhất cung cấp một cách tiếp cận vững chắc (có thể được đặt thành toàn cục hoặc dạng hạt) mà không có nội dung javascript lạ. Tôi có thể upvote hai lần?
T-moty

19

Sử dụng jQuery để tự động chuyển đổi ngày với $.parseJSON

Lưu ý : câu trả lời này cung cấp một tiện ích mở rộng jQuery có thêm hỗ trợ định dạng ngày ISO và .net tự động.

Vì bạn đang sử dụng Asp.net MVC, tôi nghi ngờ bạn đang sử dụng jQuery ở phía máy khách. Tôi đề nghị bạn đọc bài đăng trên blog này có mã cách sử dụng $.parseJSONđể tự động chuyển đổi ngày cho bạn.

Mã hỗ trợ các ngày được định dạng Asp.net giống như các ngày bạn đã đề cập cũng như các ngày được định dạng ISO. Tất cả các ngày sẽ được tự động định dạng cho bạn bằng cách sử dụng $.parseJSON().


2
Lúc đầu tôi nghĩ cách tiếp cận này rất hiệu quả. (Xem bình luận ở cuối bài viết để biết cách đăng ký trình chuyển đổi trong $ .ajaxSetup ()) Tuy nhiên, một nhược điểm lớn của giải pháp này là nó không hỗ trợ ngày trước Epoc (1970) ..... vì vậy bây giờ tôi đã quyết định từ bỏ các tệp .asmx và chuyển sang WebAPI, định dạng ngày tốt hơn (sử dụng JSON.NET) và sẽ tránh được tất cả sự cố này.
ClearCloud8

11

Giao tiếp Ajax giữa máy khách và máy chủ thường liên quan đến dữ liệu ở định dạng JSON. Mặc dù JSON hoạt động tốt cho các chuỗi, số và Booleans, nhưng nó có thể gây ra một số khó khăn cho ngày do cách ASP.NET tuần tự hóa chúng. Vì nó không có bất kỳ đại diện đặc biệt nào cho ngày tháng, chúng được tuần tự hóa dưới dạng chuỗi đơn giản. Là một giải pháp, cơ chế tuần tự hóa mặc định của ASP.NET Web Forms và MVC tuần tự hóa ngày ở dạng đặc biệt - / Ngày (tick) / - trong đó tick là số mili giây kể từ ngày 1 tháng 1 năm 1970.

Vấn đề này có thể được giải quyết theo 2 cách:

phía khách hàng

Chuyển đổi chuỗi ngày nhận được thành một số và tạo một đối tượng ngày bằng cách sử dụng hàm tạo của lớp ngày với các dấu làm tham số.

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

phía máy chủ

Giải pháp trước đó sử dụng tập lệnh phía máy khách để chuyển đổi ngày thành đối tượng Ngày JavaScript. Bạn cũng có thể sử dụng mã phía máy chủ nối tiếp các phiên bản .NET DateTime theo định dạng bạn chọn. Để hoàn thành nhiệm vụ này, bạn cần tạo ActionResult của riêng mình và sau đó tuần tự hóa dữ liệu theo cách bạn muốn.

tham khảo: http://www.developer.com/net/deals-with-json-dates-in-asp.net-mvc.html


7

Tôi đã có cùng một vấn đề và thay vì trả về giá trị ngày thực tế tôi chỉ sử dụng ToString ("dd MMM yyyy") trên đó. Sau đó, trong javascript của tôi, tôi đã sử dụng Ngày mới (datevalue), trong đó datevalue có thể là "01 tháng 1 năm 2009".


1
Điều này nên có nhiều upvote hơn. Nó ít nhất là tốt như những người được đánh giá cao nhất. Thanh lịch hơn một chút so với cắt dây. Cá nhân, tôi đã sử dụng điều này nhưng không tạo lại đối tượng ngày ở mặt trước vì tôi chỉ cần hiển thị nó, vì vậy tôi chỉ hiển thị chuỗi được định dạng (hơi khác). Cảm ơn vì tiền boa, @Joe!
vbullinger

1
Nó không phân tách các mối quan tâm, tức là đặt mối quan tâm về cách hiển thị một ngày ở mặt trước ở mặt sau. Nhưng meh, nó vẫn thanh lịch hơn.
A. Murray

1
Tại sao không sử dụng một cái gì đó ít mong manh, như thế ToString("o")nào?
b Liệu

"dd MMM yyyy" không được hỗ trợ bởi ECMA-262, vì vậy bạn không nên mong đợi trình phân tích cú pháp tích hợp để phân tích cú pháp
RobG

3

Xem chủ đề này:

http://forums.asp.net/p/1038457/1441866.aspx#1441866

Về cơ bản, trong khi Date()định dạng là javascript hợp lệ, nó KHÔNG phải là JSON hợp lệ (có một sự khác biệt). Nếu bạn muốn định dạng cũ, có thể bạn sẽ phải tự tạo mặt tiền và tự chuyển đổi giá trị hoặc tìm cách lấy serializer cho loại của mình trong đó JsonResultvà sử dụng định dạng tùy chỉnh cho ngày.


Bạn nghĩ rằng bạn có nghĩa là "trong khi định dạng Ngày () mới là javascript hợp lệ" [lưu ý từ khóa "mới"]?
JPot

2

Không phải là cách thanh lịch nhất nhưng điều này làm việc cho tôi:

var ms = date.substring(6, date.length - 2);
var newDate = formatDate(ms);


function formatDate(ms) {

    var date = new Date(parseInt(ms));
    var hour = date.getHours();
    var mins = date.getMinutes() + '';
    var time = "AM";

    // find time 
    if (hour >= 12) {
        time = "PM";
    }
    // fix hours format
    if (hour > 12) {
        hour -= 12;
    }
    else if (hour == 0) {
        hour = 12;
    }
    // fix minutes format
    if (mins.length == 1) {
        mins = "0" + mins;
    }
    // return formatted date time string
    return date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() + " " + hour + ":" + mins + " " + time;
}

2

Tôi đã nghiên cứu một giải pháp cho vấn đề này vì không có câu trả lời nào ở trên thực sự giúp tôi. Tôi đang làm việc với lịch tuần jquery và cần ngày của tôi để có thông tin múi giờ trên máy chủ và cục bộ trên trang. Sau khi đào bới một chút, tôi đã tìm ra một giải pháp có thể giúp đỡ người khác.

Tôi đang sử dụng asp.net 3.5, so với 2008, asp.net MVC 2 và lịch tuần jquery,

Đầu tiên, tôi đang sử dụng một thư viện được viết bởi Steven Levithan, giúp xử lý các ngày ở phía khách hàng, thư viện ngày của Steven Levithan . Định dạng isoUtcDateTime là hoàn hảo cho những gì tôi cần. Trong cuộc gọi AJAX jquery của tôi, tôi sử dụng chức năng định dạng được cung cấp với thư viện với định dạng isoUtcDateTime và khi cuộc gọi ajax chạm vào phương thức hành động của tôi, Loại thời gian được đặt thành cục bộ và phản ánh thời gian của máy chủ.

Khi tôi gửi ngày đến trang của mình qua AJAX, tôi gửi chúng dưới dạng chuỗi văn bản bằng cách định dạng ngày bằng cách sử dụng "ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'zzzz". Định dạng này dễ dàng chuyển đổi phía khách hàng bằng cách sử dụng

var myDate = new Date(myReceivedDate);

Đây là giải pháp hoàn chỉnh của tôi trừ nguồn của Steve Levithan, mà bạn có thể tải xuống:

Điều khiển:

public class HomeController : Controller
{
    public const string DATE_FORMAT = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz";

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }


    public JsonResult GetData()
    {
        DateTime myDate = DateTime.Now.ToLocalTime();

        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }

    public JsonResult ReceiveData(DateTime myDate)
    {
        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }
}

Javascript:

<script type="text/javascript">

function getData() {
    $.ajax({
        url: "/Home/GetData",
        type: "POST",
        cache: "false",
        dataType: "json",
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
            sendData(newDate);
        }
    });
} 

function cleanDate(d) {
    if (typeof d == 'string') {
        return new Date(d) || Date.parse(d) || new Date(parseInt(d));
    }
    if (typeof d == 'number') {
        return new Date(d);
    }
    return d;
}

function sendData(newDate) {
    $.ajax({
        url: "/Home/ReceiveData",
        type: "POST",
        cache: "false",
        dataType: "json",
        data:
        {
            myDate: newDate.format("isoUtcDateTime")
        },
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
        }
    });
}

// bind myButton click event to call getData
$(document).ready(function() {
    $('input#myButton').bind('click', getData);
});
</script>

Tôi hy vọng ví dụ nhanh này sẽ giúp những người khác trong tình huống tương tự tôi gặp phải. Tại thời điểm này, nó dường như hoạt động rất tốt với Microsoft JSON serialization và giữ cho ngày của tôi chính xác theo các múi giờ.


Nếu bạn có thể chỉ định định dạng của ngày, thì bạn nên sử dụng ISO 8601 mở rộng vì đó là định dạng duy nhất mà ECMA-262 yêu cầu hỗ trợ.
RobG

2

Cách tốt hơn để xử lý ngày trong knockoutjs là sử dụng thư viện khoảnh khắc và xử lý ngày như ông chủ. Bạn có thể dễ dàng xử lý các ngày như / Ngày (-62135578800000) /. Không cần bận tâm về cách ngày xê-ri hóa của bạn trong bộ điều khiển.

function jsonToDate(date,format) {
   return moment(date).format(format);
}

sử dụng nó như

var formattedDate = jsonToDate(date,'MM/DD/YYYY')

Momentjs hỗ trợ rất nhiều định dạng thời gian ngày và các chức năng tiện ích vào ngày.


1

Định dạng ngày trong truy vấn.

var _myModel = from _m in model.ModelSearch(word)
    select new { date = ((DateTime)_m.Date).ToShortDateString() };

Vấn đề duy nhất với giải pháp này là bạn sẽ không nhận được bất kỳ kết quả nào nếu BẤT K of giá trị ngày nào là null. Để giải quyết vấn đề này, bạn có thể đặt câu lệnh có điều kiện vào truy vấn TRƯỚC KHI bạn chọn ngày bỏ qua ngày null hoặc bạn có thể thiết lập truy vấn để nhận tất cả kết quả và sau đó lặp qua tất cả thông tin đó bằng vòng lặp foreach và gán giá trị đến tất cả các ngày không có giá trị TRƯỚC KHI bạn chọn CHỌN mới.

Ví dụ về cả hai:

var _test = from _t in adc.ItemSearchTest(word)
                        where _t.Date != null
                        select new { date = ((DateTime)_t.Date).ToShortDateString() };

Tùy chọn thứ hai yêu cầu hoàn toàn một truy vấn khác để bạn có thể gán giá trị cho tất cả các giá trị null. Vòng lặp foreach này sẽ phải TRƯỚC KHI truy vấn của bạn để chọn các giá trị.

var _testA = from _t in adc.ItemSearchTest(word)
                         select _i;

            foreach (var detail in _testA)
            {
                if (detail.Date== null)
                {
                    detail.Date= Convert.ToDateTime("1/1/0001");
                }
            }

Chỉ là một ý tưởng mà tôi thấy dễ dàng hơn tất cả các ví dụ javascript.


1

Bạn có thể sử dụng phương pháp này:

String.prototype.jsonToDate = function(){
    try{
        var date;
        eval(("date = new " + this).replace(/\//g,''));
        return date;
    } 
    catch(e){
        return new Date(0);
    }
};

1

0

Trong cshtml của bạn,

<tr ng-repeat="value in Results">                
 <td>{{value.FileReceivedOn | mydate | date : 'dd-MM-yyyy'}} </td>
</tr>

Trong tệp JS của bạn, có thể app.js,

Bên ngoài app.controll, thêm bộ lọc bên dưới.

Ở đây "mydate" là chức năng mà bạn đang gọi để phân tích ngày. Ở đây "ứng dụng" là biến chứa angular.module

app.filter("mydate", function () {
    var re = /\/Date\(([0-9]*)\)\//;
    return function (x) {
        var m = x.match(re);
        if (m) return new Date(parseInt(m[1]));
        else return null;
    };
});

Điều này rất cụ thể cho angularjs, không phải tất cả mọi người sử dụng nó, nhưng điều này làm việc cho tôi, cảm ơn bạn.
Lauro182

0

thêm plugin jquery ui trong trang của bạn.

function JsonDateFormate(dateFormate, jsonDateTime) {
    return $.datepicker.formatDate(dateFormate, eval('new ' + jsonDateTime.slice(1, -1)));
};

0

Không phải vì không có gì, nhưng có một cách khác. Đầu tiên, xây dựng truy vấn LINQ của bạn. Sau đó, xây dựng một truy vấn về kết quả liệt kê và áp dụng bất kỳ loại định dạng nào phù hợp với bạn.

var query = from t in db.Table select new { t.DateField };
var result = from c in query.AsEnumerable() select new { c.DateField.toString("dd MMM yyy") };

Tôi phải nói rằng, bước bổ sung là gây phiền nhiễu, nhưng nó hoạt động độc đáo.


0

Điều làm việc cho tôi là tạo ra một viewmodel chứa thuộc tính date dưới dạng một chuỗi. Gán thuộc tính DateTime từ mô hình miền và gọi .ToString () trên thuộc tính date trong khi gán giá trị cho viewmodel.

Kết quả JSON từ phương thức hành động MVC sẽ trả về ngày ở định dạng tương thích với chế độ xem.

Xem mô hình

public class TransactionsViewModel
{
    public string DateInitiated { get; set; }
    public string DateCompleted { get; set; }
}

Mô hình miền

public class Transaction{
   public DateTime? DateInitiated {get; set;}
   public DateTime? DateCompleted {get; set;}
}

Phương thức hành động của bộ điều khiển

public JsonResult GetTransactions(){

var transactions = _transactionsRepository.All;
        var model = new List<TransactionsViewModel>();

        foreach (var transaction in transactions)
        {
            var item = new TransactionsViewModel
            {
                ...............
                DateInitiated = transaction.DateInitiated.ToString(),
                DateCompleted = transaction.DateCompleted.ToString(),
            };

            model.Add(item);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
}


0

Làm phiền, phải không?

Giải pháp của tôi là thay đổi dịch vụ WCF của mình để khiến nó trả về DateTimes ở định dạng dễ đọc hơn (không phải Microsoft). Lưu ý bên dưới, " UpdateDateOriginal", định dạng ngày mặc định của WCF và "" của tôi UpdateDate, được định dạng thành thứ gì đó dễ đọc hơn.

nhập mô tả hình ảnh ở đây

Đây là cách thực hiện:

Thay đổi định dạng ngày WCF

Hi vọng điêu nay co ich.


0

Tôi thấy đây là cách dễ nhất để thay đổi phía máy chủ.

using System.Collections.Generic;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;

namespace Website
{
    /// <summary>
    /// This is like MVC5's JsonResult but it uses CamelCase and date formatting.
    /// </summary>
    public class MyJsonResult : ContentResult
    {
        private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List<JsonConverter> { new StringEnumConverter() }
        };

        public FindersJsonResult(object obj)
        {
            this.Content = JsonConvert.SerializeObject(obj, Settings);
            this.ContentType = "application/json";
        }
    }
}

0

Tôi đã có một số vấn đề xuất hiện với ngày JSON và quyết định loại bỏ vấn đề bằng cách giải quyết vấn đề ngày trong SQL. Thay đổi định dạng ngày thành định dạng chuỗi

select flddate from tblName

select flddate, convert(varchar(12), flddate, 113) as fldDateStr from tblName

Bằng cách sử dụng fldDateStr, vấn đề đã biến mất và tôi vẫn có thể sử dụng trường ngày để sắp xếp hoặc các mục đích khác.


0

Nó trả về định dạng ngày của máy chủ. Bạn cần xác định chức năng của riêng bạn.

function jsonDateFormat(jsonDate) {
  // Changed data format;
  return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");
};

0

Đây là một số mã JavaScript tôi đã viết để thiết lập một <input type="date">giá trị từ một ngày được truyền từ ASP.NET MVC.

var setDate = function(id, d) {
  if (d !== undefined && d !== null) {
    var date = new Date(parseInt(d.replace("/Date(", "").replace(")/", ""), 10));
    var day = ('0' + date.getDate()).slice(-2);
    var month = ('0' + (date.getMonth() + 1)).slice(-2);
    var parsedDate = date.getFullYear() + "-" + (month) + "-" + (day);
    $(id).val(parsedDate);
  }
};

Bạn gọi hàm này như vậy:

setDate('#productCommissionStartDate', data.commissionStartDate);

Đâu commissionStartDatelà ngày JSON được thông qua bởi MVC.


-1

Cách dễ nhất:

var milisegundos = parseInt (data.replace ("/ Ngày (", "") .replace (") /", ""));
Var newDate = Ngày mới (milisegundos). toLocaleDateString ("en-UE");

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.