ASP.NET MVC JsonResult 날짜 형식


248

내 모델의 JsonResult를 효과적으로 반환하는 컨트롤러 작업이 있습니다. 그래서 내 방법에는 다음과 같은 것이 있습니다.

return new JsonResult(myModel);

이것은 하나의 문제를 제외하고는 잘 작동합니다. 모델에 날짜 속성이 있으며 이는 다음과 같이 Json 결과에 반환되는 것으로 나타납니다.

"\/Date(1239018869048)\/"

필요한 형식으로 반환되도록 날짜를 어떻게 처리해야합니까? 또는 스크립트에서이 형식을 어떻게 처리합니까?


내 json net 결과를 동일한 문제에 게시했으며 날짜를 iso 형식으로 변환하여 작업하기가 훨씬 쉽습니다. stackoverflow.com/questions/15778599/…
Kieran

아래 링크를 확인하십시오. 똑바로 앞으로. stackoverflow.com/a/60392503/5962626
Mohamedasiq

답변:


195

casperOne의 답변 을 확장하십시오 .

JSON 사양은 날짜 값을 고려하지 않습니다. MS는 전화를했고, 그들이 선택한 경로 문자열의 자바 스크립트 표현에 약간의 트릭을 악용했다 : 문자열 리터럴을 "/", "\ /"와 동일하며, 문자열 리터럴이됩니다 결코 "에 연재하지 얻을 \ / "("\ / "도"\\ / "에 매핑되어야 함)

자세한 설명 은 http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 를 참조 하십시오 ( "JavaScript 리터럴에서 JSON으로"스크롤)

JSON의 아픈 점 중 하나는 날짜 / 시간 리터럴이 없다는 것입니다. 많은 사람들이 JSON을 처음 접했을 때 이것을 배우는 것에 놀랐고 실망했습니다. 날짜 / 시간 리터럴이없는 것에 대한 간단한 설명 (위안 여부)은 JavaScript에 다음 중 하나가 없다는 것입니다. JavaScript의 날짜 및 시간 값에 대한 지원은 전적으로 Date 객체를 통해 제공됩니다. 따라서 JSON을 데이터 형식으로 사용하는 대부분의 응용 프로그램은 일반적으로 날짜 또는 시간 값을 표현하기 위해 문자열 또는 숫자를 사용하는 경향이 있습니다. 문자열이 사용되는 경우 일반적으로 ISO 8601 형식 일 것으로 예상 할 수 있습니다. 대신 숫자를 사용하는 경우이 값은 일반적으로 에포크 이후의 UTC (Universal Coordinated Time)에서 밀리 초 수를 의미하는 것으로 간주되며, 여기서 에포크는 1970 년 1 월 1 일 자정 (UTC)으로 정의됩니다. 다시, 이것은 단순한 규칙이며 JSON 표준의 일부가 아닙니다. 다른 애플리케이션과 데이터를 교환하는 경우 문서를 확인하여 JSON 리터럴 내에서 날짜 및 시간 값을 인코딩하는 방법을 확인해야합니다. 예를 들어, Microsoft의 ASP.NET AJAX는 설명 된 규칙 중 어느 것도 사용하지 않습니다. 대신 .NET DateTime 값을 JSON 문자열로 인코딩합니다. 여기서 문자열의 내용은 / Date (ticks) /이고 틱은 에포크 (UTC) 이후 밀리 초를 나타냅니다. 1989 년 11 월 29 일 오전 4시 55 분 30 초 (UTC)는 "\ / Date (628318530718) \ /"로 인코딩됩니다. NET AJAX는 설명 된 규칙 중 어느 것도 사용하지 않습니다. 대신 .NET DateTime 값을 JSON 문자열로 인코딩합니다. 여기서 문자열의 내용은 / Date (ticks) /이고 틱은 에포크 (UTC) 이후 밀리 초를 나타냅니다. 1989 년 11 월 29 일 오전 4시 55 분 30 초 (UTC)는 "\ / Date (628318530718) \ /"로 인코딩됩니다. NET AJAX는 설명 된 규칙 중 어느 것도 사용하지 않습니다. 대신 .NET DateTime 값을 JSON 문자열로 인코딩합니다. 여기서 문자열의 내용은 / Date (ticks) /이고 틱은 에포크 (UTC) 이후 밀리 초를 나타냅니다. 1989 년 11 월 29 일 오전 4시 55 분 30 초 (UTC)는 "\ / Date (628318530718) \ /"로 인코딩됩니다.

해결책은 그냥 파싱하는 것입니다.

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

그러나 serializer가 구문으로 DateTime객체 를 출력하도록 설정하는 곳이 있다고 들었습니다 new Date(xxx). 나는 그것을 파 내려고 노력할 것이다.


의 두 번째 매개 변수는 반환되기 전에 값이 원래 생성 된 방식을 규정하는 함수 를 JSON.parse()승인합니다 reviver.

날짜의 예는 다음과 같습니다.

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;
});

JSON.parse () 문서를 참조하십시오


1
고마워, 파싱은 어디로 갈 것인가?
Jon Archway

내가 게시 한 코드는 JavaScript입니다. 클라이언트 코드에 넣을 것입니다.
JPot

6
당신은 새로운 날짜 (으로 parseInt (dateString.replace (/ \ / 일 \ ((\ D +) \) \ // GI, "$ 1")))에 JS 단축 할 수
켐프를 ͩ

6
실제로 정규식은 날짜도 -ve 숫자로 표시 될 수 있으므로 replace (/ \ / Date \ ((-? \ d +) \) \ // gi, "$ 1")
보다 정확합니다.

1
@HarshilShah의 두 번째 주장입니다 parseInt(). 10 진수 시스템에서 정수를 추출하도록 함수에 지시합니다. 기수입니다. 8거기에 넣으면 8 진수가 추출됩니다.
AnalogWeapon

99

Javascript의 솔루션은 다음과 같습니다.

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

"value.substr (6)"은 "/ Date ("부분을 가져오고 parseInt 함수는 끝에서 발생하는 숫자가 아닌 문자를 무시합니다.

편집 : 기수를 의도적으로 생략했습니다 (parseInt의 두 번째 인수). 아래 내 의견을 참조하십시오 . 또한 ISO-8601 날짜가이 이전 형식보다 선호되므로이 형식은 일반적으로 새로운 개발에 사용해서는 안됩니다. ISO-8601 형식을 사용하여 날짜를 직렬화하는 훌륭한 대안 은 훌륭한 Json.NET 라이브러리를 참조하십시오 .

ISO-8601 형식의 JSON 날짜의 경우 문자열을 Date 생성자에 전달하십시오.

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

1
+1 나는 당신의 간단한 해결책을 가지고 재귀 함수에 넣었습니다. 여기를 참조하십시오 : danielsadventure.info/dotnetdatetime
비비안 강

7
parseInt를 사용할 때는 항상 기수를 지정해야합니다. [출처] : developer.mozilla.org/en-US/docs/JavaScript/Reference/…
John Zabroski

6
@JohnZabroski : 모든 규칙에는 예외가 있습니다. .NET 날짜 시리얼 라이저 는 선행 0을 갖는 정수를 반환 하지 않으므로 기수를 안전하게 제거 할 수 있습니다.
Roy Tinker

4
우리는 거의 같은 것을 가졌습니다. value.substr(6, 13)숫자가 아닌 다른 문자를 제거하는 데 사용 했습니다. 그러나 그렇게하면 04/26/1938 이전의 모든 날짜가 유효하지 않습니다! parseInt숫자가 아닌 문자를 무시할 줄 은 몰랐습니다 . 감사!
랄프 얀센

2
@ JohnZabroski— ECMAScript ed 5 (2011) parseInt기준으로 선행 0을 무시해야합니다 .
RobG

69

클라이언트 측을 처리하는 데 약간의 답변이 있지만 원하는 경우 출력 서버 측을 변경할 수 있습니다.

이것에 접근하는 몇 가지 방법이 있습니다. 기본부터 시작하겠습니다. JsonResult 클래스를 서브 클래 싱하고 ExecuteResult 메소드를 대체해야합니다. 거기에서 직렬화를 변경하는 몇 가지 방법을 사용할 수 있습니다.

접근법 1 : 기본 구현은 JsonScriptSerializer를 사용합니다 . 문서를 살펴보면 RegisterConverters 메소드를 사용하여 사용자 정의 JavaScriptConverters 를 추가 할 수 있습니다 . JavaScriptConverter는 사전으로 직렬화됩니다. 즉, 객체를 가져 와서 Json 사전으로 직렬화합니다. 객체를 문자열로 직렬화하려면 약간의 해커가 필요합니다 . post를 참조하십시오 . 이 특정 핵은 또한 문자열을 탈출합니다.

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));
        }
    }
}

접근 방식 2 (권장) : 두 번째 접근 방식은 재정의 된 JsonResult로 시작하여 다른 경우에는 Json.NET 직렬 변환기와 함께 다른 Json 직렬 변환기를 사용하는 것입니다. 이것은 접근법 1의 해커가 필요하지 않습니다. 다음은 JsonResult 서브 클래스의 구현입니다.

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));
        }
    }
}

사용 예 :

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

추가 크레딧 : James Newton-King


통화, 식별 번호, 전화 등의 다른 형식은 어떻습니까? ModelMetadata에서 이러한 형식을 가져 와서 모델을 Json으로 직렬화하는 데 더 나은 방법은 아닙니다. 어떻게 ?
Luciano

1
이것이 최선의 해결책입니다 (부패하기 쉬운 Dave의 답변). 서버는 정확한 날짜 형식을 제공 할 책임이 있습니다. 또한 사용자 정의 JsonResult가 있으면 더 많은 이점과 제어 기능이 제공됩니다. JsonResult를 데이터로 인스턴스화하는 "Json (data)"가 있으면 CustomJsonResult를 인스턴스화하는 도우미 메소드 "CustomJson (data)"을 구현하는 것이 좋습니다.
sports

2
이러한 방법 중 하나를 사용하는 경우 한 가지 수정이 필요합니다. 첫 번째 행은 다음과 같아야합니다. private const string _dateFormat = "yyyy-MM-ddTHH : mm : ss"; "T"를 추가했습니다.
Dominick

31

Moment.js는이를 지원하는 광범위한 날짜 / 시간 라이브러리입니다. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

예 : moment ( "/ Date (1198908717056-0700) /")

도움이 될 수 있습니다. 플 런커 출력


먼저 moment.js 파일을 다운로드하십시오. 사용하는 것보다 프로젝트에 추가 moment("json_date_string_value").format('appropriate format'); 하면 momet.js 페이지에 다른 형식의 값을 볼 수 있습니다
Harshil 샤에게

20

나는 새를 만드는 것을 발견 JsonResult하고 반환하는 것은 만족스럽지 - 모든 통화를 대체하는 데 return Json(obj)return new MyJsonResult { Data = obj }고통이다.


내가 생각 그래서, 왜 그냥가 납치하지 JsonResult를 사용하여 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));
            }
        }
    }
}

이것은 JsonResultJSON.Net을 대신 사용 하여 a 를 반환하는 모든 메소드에 적용될 수 있습니다 .

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

응답합니다

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

바라는대로!


is모든 요청에서 비교를 호출하는 것이 마음에 들지 않으면 이것을 다음에 추가하십시오 FilterConfig.

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

이제 모든 JSON이 기본 제공 대신 JSON.Net으로 직렬화됩니다 JavaScriptSerializer.


이상한 자바 스크립트 인라인없이 견고한 접근 방식 (전역 또는 세분화로 설정할 수 있음)을 제공하는 유일한 대답입니다. 투표를 두 번 할 수 있습니까?
T-moty

19

jQuery를 사용하여 날짜를 자동 변환 $.parseJSON

참고 :이 답변은 자동 ISO 및 .net 날짜 형식 지원을 추가하는 jQuery 확장을 제공합니다.

Asp.net MVC를 사용하고 있기 때문에 클라이언트 측에서 jQuery를 사용하고 있다고 생각합니다. 날짜를 자동으로 변환 하는 데 사용 하는 코드가있는 이 블로그 게시물 을 읽는 것이 좋습니다 $.parseJSON.

코드는 언급 한 날짜 및 ISO 형식 날짜와 같은 Asp.net 형식 날짜를 지원합니다. 를 사용하여 모든 날짜가 자동으로 지정됩니다 $.parseJSON().


2
처음에는이 방법이 매우 효과적이라고 생각했습니다. ($ .ajaxSetup ()에 변환기를 등록하는 방법에 대해서는 기사 끝의 주석을 참조하십시오.) 그러나이 솔루션의 큰 단점은 Epoc (1970) 이전 날짜를 지원하지 않는다는 것입니다. .asmx 파일을 포기하고 WebAPI로 전환하여 날짜를 더 잘 형식화 (JSON.NET 사용) 하고이 모든 문제를 피하기로 결정했습니다.
ClearCloud8

11

클라이언트와 서버 간의 Ajax 통신에는 종종 JSON 형식의 데이터가 포함됩니다. JSON은 문자열, 숫자 및 부울에서 잘 작동하지만 ASP.NET에서 직렬화하는 방식으로 인해 날짜에 약간의 어려움이 발생할 수 있습니다. 날짜에 대한 특별한 표현이 없으므로 일반 문자열로 직렬화됩니다. 해결책으로 ASP.NET Web Forms 및 MVC의 기본 직렬화 메커니즘은 날짜를 특수한 형식 인 / Date (ticks) /-로 직렬화합니다. 여기서 ticks는 1970 년 1 월 1 일 이후의 밀리 초 수입니다.

이 문제는 두 가지 방법으로 해결할 수 있습니다.

고객 입장에서

수신 된 날짜 문자열을 숫자로 변환하고 눈금을 매개 변수로 사용하여 날짜 클래스의 생성자를 사용하여 날짜 오브젝트를 작성하십시오.

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();
}

서버 측

이전 솔루션은 클라이언트 쪽 스크립트를 사용하여 날짜를 JavaScript Date 객체로 변환합니다. .NET DateTime 인스턴스를 선택한 형식으로 직렬화하는 서버 측 코드를 사용할 수도 있습니다. 이 작업을 수행하려면 고유 한 ActionResult를 만든 다음 원하는 방식으로 데이터를 직렬화해야합니다.

참조 : http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

같은 문제가 발생하여 실제 날짜 값을 반환하는 대신 ToString ( "dd MMM yyyy")을 사용했습니다. 그런 다음 내 자바 스크립트에서 new Date (datevalue)를 사용했습니다. 여기서 datevalue는 "01 Jan 2009"입니다.


1
여기에는 더 많은 투표가 있어야합니다. 적어도 가장 많이지지 된 것만 큼 좋습니다. 줄을 자르는 것보다 조금 더 우아합니다. 개인적으로, 나는 이것을 사용했지만 방금 표시해야 할 때 날짜 객체를 프런트 엔드에서 다시 만들지 않았으므로 (약간 다르게) 형식화 된 문자열을 표시했습니다. 팁을 주셔서 감사합니다, @ 조!
vbullinger

1
문제의 분리, 즉 날짜가 백엔드의 프런트 엔드에 표시되는 방식에 대한 우려를 두는 것은 아닙니다. 그러나 meh, 그것은 여전히 ​​더 우아합니다.
A. 머레이

1
왜 덜 취약한 것을 사용하지 ToString("o")않습니까?
binki

ECMA-262는 "dd MMM yyyy"를 지원하지 않으므로 내장 파서가 구문 분석을 기대하지 않아야합니다.
RobG

3

이 스레드를 참조하십시오 :

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

기본적으로 Date()형식은 유효한 자바 스크립트이지만 유효한 JSON이 아닙니다 (차이가 있습니다). 이전 형식을 원한다면 파사드를 만들고 값을 직접 변환하거나 형식에 맞는 serializer를 가져 와서 JsonResult날짜에 사용자 지정 형식을 사용해야합니다.


"새로운 Date () 형식이 유효한 자바 스크립트 일 때" "새 키워드"에 유의하십시오.
JPot

2

가장 우아한 방법은 아니지만 이것은 나를 위해 일했습니다.

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

위의 답변 중 어느 것도 실제로 도움이되지 않았 으므로이 문제에 대한 해결책을 찾고 있습니다. jquery week calendar로 작업하고 있으며 서버 및 로컬 페이지에서 시간대 정보를 사용하려면 날짜가 필요했습니다. 꽤 파고 들자 다른 사람들을 도울 수있는 솔루션을 찾았습니다.

asp.net 3.5, 2008 vs. asp.net MVC 2 및 jquery week calendar를 사용하고 있습니다.

먼저 Steven Levithan이 작성한 라이브러리를 사용하여 클라이언트 측 의 날짜Steven Levithan의 날짜 라이브러리 를 처리하는 데 도움을줍니다 . isoUtcDateTime 형식은 내가 필요한 것에 완벽합니다. jquery AJAX 호출에서 라이브러리와 함께 제공된 isoUtcDateTime 형식의 format 함수를 사용하고 ajax 호출이 내 액션 메소드에 도달하면 datetime Kind가 local로 설정되고 서버 시간을 반영합니다.

AJAX를 통해 페이지에 날짜를 보내면 "ddd, dd MMM yyyy HH ':'mm ':'s'GMT'zzzz"를 사용하여 날짜를 형식화하여 텍스트 문자열로 보냅니다. 이 형식은 다음을 사용하여 클라이언트 측에서 쉽게 변환됩니다.

var myDate = new Date(myReceivedDate);

Steve Levithan의 소스를 뺀 나의 완전한 해결책은 다음과 같습니다.

제어 장치:

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) } };
    }
}

자바 스크립트 :

<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>

이 빠른 예제가 내가했던 것과 같은 상황에서 다른 사람들을 도울 수 있기를 바랍니다. 현재는 Microsoft JSON 직렬화와 매우 잘 작동하며 시간대에 따라 날짜를 정확하게 유지합니다.


날짜 형식을 지정할 수있는 경우 ECMA-262가 지원해야하는 유일한 형식이므로 ISO 8601 확장을 사용해야합니다.
RobG

2

knockoutjs에서 날짜를 처리하는 더 좋은 방법은 순간 라이브러리를 사용하고 보스와 같은 날짜를 처리하는 것입니다. / Date (-62135578800000) /와 같은 날짜를 쉽게 처리 할 수 ​​있습니다. 컨트롤러에서 날짜를 직렬화하는 방법을 귀찮게 할 필요가 없습니다.

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

처럼 사용

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

momentjs 는 날짜에 많은 날짜 시간 형식과 유틸리티 기능을 지원합니다.


1

쿼리 내에서 날짜를 형식화하십시오.

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

이 솔루션의 유일한 문제점은 날짜 값 중 하나라도 null 인 경우 결과를 얻지 못한다는 것입니다. 이 문제를 해결하려면 날짜 널을 무시하는 날짜를 선택하기 전에 쿼리에 조건문을 넣거나 모든 결과를 가져 오도록 쿼리를 설정 한 다음 foreach 루프를 사용하여 해당 정보를 모두 반복하고 값을 지정할 수 있습니다 SELECT를 새로하기 전에 null 인 모든 날짜까지.

둘의 예 :

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

두 번째 옵션에는 다른 쿼리가 완전히 필요하므로 모든 null에 값을 할당 할 수 있습니다. 이것과 foreach 루프는 값을 선택하는 쿼리 전에 있어야합니다.

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");
                }
            }

모든 자바 스크립트 예제보다 쉽게 ​​찾은 아이디어입니다.


1

이 방법을 사용할 수 있습니다 :

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

1

0

cshtml에서

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

JS 파일에서 app.js,

app.controller 외부에 아래 필터를 추가하십시오.

여기서 "mydate"는 날짜를 구문 분석하기 위해 호출하는 함수입니다. 여기서 "앱"은 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;
    };
});

이것은 angularjs에 매우 구체적이며 모든 사람들이 그것을 사용하는 것은 아니지만 이것은 나를 위해 일했습니다. 감사합니다.
Lauro182

0

페이지에 jquery ui 플러그인을 추가하십시오.

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

0

아무것도 아니지만 다른 방법이 있습니다. 먼저 LINQ 쿼리를 구성하십시오. 그런 다음 열거 결과에 대한 쿼리를 구성하고 어떤 형식의 형식이 적합한 지 적용하십시오.

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") };

추가 단계는 성가신 일이지만 훌륭하게 작동합니다.


0

나를 위해 일한 것은 날짜 속성을 문자열로 포함하는 뷰 모델을 만드는 것이 었습니다. 도메인 모델에서 DateTime 속성을 할당하고 값을 뷰 모델에 할당하는 동안 date 속성에서 .ToString ()을 호출합니다.

MVC 작업 메서드의 JSON 결과는 뷰와 호환되는 형식으로 날짜를 반환합니다.

모델보기

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

도메인 모델

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

컨트롤러 동작 방법

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

성 가시지 않습니까?

내 솔루션은 WCF 서비스를 변경하여 DateTimes를 더 읽기 쉬운 (비 Microsoft) 형식으로 반환하도록하는 것입니다. 아래 UpdateDateOriginal는 WCF의 기본 날짜 형식 인 " UpdateDate" 및 더 읽기 쉬운 형식으로되어있는 " "입니다.

여기에 이미지 설명을 입력하십시오

방법은 다음과 같습니다.

WCF 날짜 형식 변경

도움이 되었기를 바랍니다.


0

이것이 서버 측을 변경하는 가장 쉬운 방법이라는 것을 알았습니다.

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

JSON 날짜와 관련된 많은 문제가 있었으며 SQL에서 날짜 문제를 해결하여 문제를 해결하기로 결정했습니다. 날짜 형식을 문자열 형식으로 변경

select flddate from tblName

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

fldDateStr을 사용하면 문제가 사라지고 정렬 또는 다른 목적으로 날짜 필드를 계속 사용할 수 있습니다.


0

서버 날짜 형식을 반환합니다. 자신의 기능을 정의해야합니다.

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

0

다음 <input type="date">은 ASP.NET MVC에서 전달 된 날짜 의 값 을 설정하는 JavaScript 코드 입니다.

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);
  }
};

이 함수를 다음과 같이 호출하십시오.

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

commissionStartDateMVC가 전달한 JSON 날짜는 어디에 있습니까 ?


-1

가장 쉬운 방법 :

var milisegundos = parseInt (data.replace ( "/ Date (", "") .replace ( ") /", "")));
Var newDate = 새로운 날짜 (milisegundos). toLocaleDateString ( "en-UE");

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.