Microsoft JSON 날짜를 어떻게 형식화합니까?


1999

jQuery를 사용 하여 Ajax 에서 첫 번째 균열을 겪고 있습니다. 내 데이터를 내 페이지로 가져오고 있지만 날짜 데이터 형식에 대해 반환되는 JSON 데이터에 문제가 있습니다. 기본적으로 다음과 같은 문자열이 다시 나타납니다.

/Date(1224043200000)/

완전히 새로운 사람부터 JSON까지-짧은 날짜 형식으로 어떻게 형식을 지정합니까? jQuery 코드 어딘가에서 처리해야합니까? 나는 성공없이 jQuery.UI.datepicker플러그인을 사용해 보았습니다 $.datepicker.formatDate().

참고 : 여기에 답변을 조합하여 사용하는 솔루션이 있습니다.

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

이 솔루션은 콜백 메소드에서 내 객체를 가져 와서 날짜 형식 라이브러리를 사용하여 페이지에 날짜를 올바르게 표시했습니다.


26
:이 재미있을 수 hanselman.com/blog/...을
citronas

6
/Date(...)/ 형식은 Microsoft의 기본 제공 JSON 날짜 형식과 관련이 있으며 표준의 일부가 아니며 Javascript에서 제공되는 JSON에는 표준이 있습니다. ISO 형식 Javascript는 다음을 지정합니다. stackoverflow.com/a / 15952652 / 176877 따라서이 질문은 Microsoft의 JSON 날짜 형식과 관련이 있습니다. 이를 명확하게하기 위해 제목을 수정했습니다.
Chris Moschini

15
농담이야! Microsoft는 JSON에 자체 스핀을 찍었습니다! 그리고 날짜에 !! 그들은 언제 배울 것인가!
Nick.McDermaid

.NET 측에서 Newtonsoft JSON을 사용하고 JS 측에서 멋진 유형의 값을 사용하려면 다음을 사용하십시오. github.com/RickStrahl/json.date-extensions
baHI

JSON 대신 JSON ++을 사용할 수 있습니다. JSON ++JSON 과 동일하지만 같은 JavaScript 유형을 지원합니다 Date.
brillout

답변:


1688

eval()필요가 없습니다. 이것은 잘 작동합니다 :

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

substr()함수는 /Date(부분을 꺼내고 parseInt()정수를 가져 와서 )/끝 부분을 무시합니다 . 결과 번호는 Date생성자에 전달됩니다 .


나는 기수를 의도적으로 생략했습니다 (에 대한 두 번째 인수 parseInt). 아래 내 의견을 참조하십시오 .

또한 Rory의 의견에 전적으로 동의합니다 . ISO-8601 날짜는이 오래된 형식보다 선호되므로이 형식은 일반적으로 새로운 개발에 사용해서는 안됩니다. ISO-8601 형식을 사용하여 날짜를 직렬화하는 훌륭한 대안 은 훌륭한 Json.NET 라이브러리를 참조하십시오 .

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

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

4
@Broam : MS가 형식을 변경하면 두 가지 방법 (바꾸기 기능 및이 답변)을 변경해야합니다.
Roy Tinker

23
기수 var date = new Date (parseInt (jsonDate.substr (6), 10));
James Kyburz

6
@JamesKyburz : 모든 규칙에는 예외가 있으며 예외가 적용될 때라고 생각합니다. .NET에서 JSON 날짜 수는 결코 우리가 안전하게 기수를 생략 할 수 있도록 선도적 인 "0"이 없다.
Roy Tinker

22
이 날짜 형식은 꽤 나쁘고 일반적으로 JSON에서 ISO-8601 형식의 날짜로 이동한다는 점은 주목할 가치가 있습니다. hanselman.com/blog/…
Rory

4
이 방법은 시간대를 고려하지 않으므로 서버와 사용자가 다른 시간대에있을 때 심각한 문제가 발생할 수 있습니다. 아래에 WCF 및 Javascript 측에서이를 처리하는 매우 빠르고 쉬운 방법을 설명하는 답변을 게시했습니다. stackoverflow.com/a/10743718/51061
Scott Willeke

135

이것을 사용하여 JSON에서 날짜를 얻을 수 있습니다.

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

그런 다음 JavaScript 날짜 형식 스크립트 (최소화 및 gzipped시 1.2KB)를 사용하여 원하는대로 표시 할 수 있습니다.


7
줄에 아무 문제가 없습니다. 시퀀스는 \ //입니다. 첫 번째 슬래시는 이스케이프 처리되므로 주석처럼 계산되지 않습니다. 그것은 당신을 속이는 편집자입니다, 선은 잘 작동합니다.
andreialecu

152
@rball, 말도 안되는jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
눈꺼풀

39
pst는 정확했습니다. 'eval'없이 다양한 방법 으로이 작업을 수행 할 수 있습니다. Crockford는 'eval Is Evil'은 읽기 어렵고 덜 안전하기 때문에 자바 스크립트 컴파일러에 부딪히기 때문에 효율성과 위험성이 더 낮음을 암시합니다.
마크 로저스

13
@Edy : new Function거의 나쁜 같은 eval: dev.opera.com/articles/view/efficient-javascript/...
마르셀 Korpel

5
@ Edy : 그것은 또 다른 형태의 평가이며, '악'과 같습니다. 대신 문자열을 구문 분석하십시오 (아래 내 답변 참조)
Roy Tinker

98

Newtonsoft Json.NET을 사용하는 사람들 은 IE8의 네이티브 JSON, Firefox 3.5 및 Json.NET을 통해 수행하는 방법을 읽으 십시오 .

또한 Json.NET으로 작성된 날짜 형식을 변경하는 방법에 대한 문서가 유용합니다. Json.NET으로 날짜 직렬화

너무 게으른 사람들을 위해 다음은 빠른 단계입니다. JSON에 느슨한 DateTime 구현이 있으므로를 사용해야합니다 IsoDateTimeConverter(). Json.NET 4.5부터 기본 날짜 형식은 ISO이므로 아래 코드는 필요하지 않습니다.

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

JSON은 다음과 같이 제공됩니다.

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

마지막으로 ISO 날짜를 JavaScript 날짜로 변환하는 일부 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;
}

나는 이것을 이렇게 사용했다

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

6
JavaScript Date 생성자는 다음 문자열을 구문 분석 할 수 있습니다.new Date("2009-04-12T20:44:55")
David Hogue

5
경고-Date () 생성자 형식 및 구문 분석은 ECMAScript 6 이전의 비표준입니다. 예를 들어, IE 9는 IS0-8601에 있더라도 생성자에게 현지 시간으로 지정한 날짜를 다른 곳에서는 UCT로 간주합니다. 오래된 브라우저를 지원하는 경우 날짜 생성자를 사용하지 마십시오. codeofmatt.com/2013/06/07/…
DanO

비 UTC 날짜를 보내면 조만간 문제가 생길 수 있습니다.
tymtam

파티에 조금 늦었지만, 무엇을 할 것인가 (+ a [1], + a [2]-1, + a [3], + a [4], + a [5], + a [6]) ; 이 맥락에서 대표?
yanant

@yanant- +a[1]etc는 정규 표현식의 배열 조각을 나타내며 +숫자로 캐스트하므로 등 이 +a[1]같습니다 2009. 다음은 배열 분석입니다. 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
Jason Jong

67

원래 예 :

/Date(1224043200000)/  

기본 제공 JSON 직렬화를 사용하여 WCF REST를 통해 날짜를 보낼 때 WCF에서 사용하는 형식이 반영되지 않습니다. (적어도 .NET 3.5, SP1에서)

여기에 대한 답변이 도움이되었지만 시간대 GMT 오프셋이 WCF JSON에서 반환 된 숫자 (1970 년 이후)에 추가되는 것처럼 보이기 때문에 정규 표현식을 약간 편집해야합니다.

WCF 서비스에는 다음이 있습니다.

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

ApptVisitLinkInfo는 간단하게 정의됩니다 :

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

"Field2"가 서비스에서 Json으로 리턴되면 값은 다음과 같습니다.

/Date(1224043200000-0600)/

시간대 오프셋이 값의 일부로 포함되어 있습니다.

수정 된 정규식 :

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

그것은 조금 더 열심이며 첫 번째 숫자뿐만 아니라 파렌 사이의 모든 것을 잡습니다. 결과 시간 sinze 1970과 시간대 오프셋을 모두 eval에 공급하여 날짜 개체를 얻을 수 있습니다.

대체를위한 JavaScript 행은 다음과 같습니다.

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

10
이것은 잘못된 것입니다. 새로운 날짜 (1224043200000-0600)는 날짜에서 600을 빼고이 경우 600 밀리 초로 6 시간이 아닙니다.
ariel April


시간대 오프셋은 .NET의 DateTime 객체에 시간대가있는 경우에만 포함된다고 생각합니다 (기본 동작). 날짜가 UTC 인 경우 DateTime.SpecifyKind (date, DateTimeKind.UTC)를 사용하면 직렬화 할 때 오프셋없이 적절한 UTC 값을 얻을 수 있으며 필요에 따라 사용자 시간대로 다시 변환 할 수 있습니다. 현지 시간 인 경우 .ToUniversalTime ()을 사용하면 UTC로 변환되고 "Kind"가 이미 지정되어 있습니다.
jvenema 1

자바 스크립트에서 -0100은 이진 문자열이므로 조심하십시오!
verbedr

WCF에서 JS로 변환 된 날짜를 얻으면 반전은 어떻습니까? 동일한 WCF에 전달하려는 날짜를 date.getTime () 사용하여 정수로 가져와야합니까?
NitinSingh

65

반복하지 마십시오. 다음을 사용하여 날짜 변환 자동화 $.parseJSON()

게시물에 대한 답변은 수동 날짜를 JavaScript 날짜로 변환합니다. jQuery를 $.parseJSON()약간 확장 했으므로 지시 할 때 날짜를 자동으로 구문 분석 할 수 있습니다. 브라우저 (및 json2.js와 같은 라이브러리)의 기본 JSON 함수가 지원하는 /Date(12348721342)/ISO 형식 날짜 ( 2010-01-01T12.34.56.789Z) 뿐만 아니라 ASP.NET 형식 날짜 ( )도 처리 합니다.

어쨌든. 날짜 변환 코드를 반복해서 반복하지 않으려면 이 블로그 게시물 을 읽고 인생을 좀 더 편하게 해줄 코드를 얻는 것이 좋습니다 .


61

JavaScript로 말하면

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

올바른 날짜임을 알 수 있으며 모든 프레임 워크를 사용하여 JavaScript 코드 어디에서나 사용할 수 있습니다.


3
그것이 내가 끝났다는 것을 제외하고는 내가 생각한 것입니다. var thedate = / Date (1224043200000) /; 적어도 나를 위해 ...
rball 2009

2
Date ()와 Date (1224043200000)는 Chrome과 Firefox에서 동일한 결과를 제공합니다. 이것이 오래된 브라우저에서 작동했는지 확실하지 않지만이 답변은 브라우저에서 작동하지 않습니다.
제임스

@ 제임스, 네, 브라우저에 최신 날짜를 제공합니다. :(
vi

9
"새 날짜 (1224043200000)"로 작성해야합니다.
BrainSlugs83

60

데모를 확인하려면 여기를 클릭하십시오

자바 스크립트 / 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();

결과 - "10/15/2008"


위의 방법을 개선했습니다. function formatearFecha (fec) {var value = new Date (parseInt (fec.replace (/ (^. * () | ([+-]. * $) / g, ''))); var mes = value.getMonth (); var dia = value.getDate (); var 날짜 = dia + "/"+ mes + "/"+ value.getFullYear (); if (dia <10) 날짜 = date.substr (0, 0) + '0'+ dia + date.substr (1); if (mes <10) date = date.substr (0, 3) + '0'+ mes + date.substr (4); 반환 날짜;} 날짜 형식 ddMMyyyy. 건배
Matias

38

업데이트

우리는 /Date(msecs)/여기에 원래 질문 된 것과 같은 Microsoft의 ASP.NET 내장 JSON 형식 과 JSON.NET을 포함한 대부분의 JSON 날짜 형식 모두에 대처 해야하는 내부 UI 라이브러리가 있습니다 2014-06-22T00:00:00.0. 또한 우리는 oldIE의 소수점 이하 자릿수를 처리 할 수없는 능력에 대처해야합니다 .

먼저 어떤 종류의 날짜를 소비하는지 감지하고 일반 JavaScript Date객체 로 구문 분석 한 다음 형식을 지정합니다.

1) Microsoft 날짜 형식 감지

// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2) 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) MS 날짜 형식 분석 :

function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}

4) ISO 날짜 형식을 구문 분석하십시오.

적어도 우리가 수정 된 표준 ISO 날짜 또는 ISO 날짜 나왔습니다 거래 항상 세 밀리 초 장소를 (이 있는지 확인 할 수있는 방법이 우리가 할 위 참조 코드가 환경에 따라 다른 정도).

4a) 표준 ISO 날짜 형식을 분석하고 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) 고정 소수점 3 밀리 초로 ISO 형식을 구문 분석하십시오. 훨씬 쉽습니다.

function parseIsoDate(s) {
    return new Date(s);
}

5) 형식을 지정하십시오.

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) 그것을 모두 묶으십시오.

function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

    return formatDate(d);
}

아래의 오래된 답변은이 날짜 형식을 jQuery 자체 JSON 구문 분석에 연결하여 문자열 대신 Date 객체를 얻거나 jQuery <1.5에 어떻게 든 붙어있는 경우에 유용합니다.

기존 답변

ASP.NET MVC와 함께 jQuery 1.4의 Ajax 함수를 사용하는 경우 다음을 사용하여 모든 DateTime 속성을 Date 객체로 설정할 수 있습니다.

// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});

jQuery 1.5에서는 parseJSONAjax 호출에서 converters 옵션을 사용하여 메소드를 전체적으로 대체하지 않아도 됩니다.

http://api.jquery.com/jQuery.ajax/

불행히도 Dates를 전 세계적으로 구문 분석하려면 구식 평가 경로로 전환해야합니다. 그렇지 않으면 구문 분석 후 더 사례별로 변환해야합니다.


27

JSON 에는 내장 날짜 유형이 없습니다 . 이것은 일부 신기원의 초 / 밀리 초처럼 보입니다. 신기원을 알고 있다면 올바른 시간을 추가하여 날짜를 만들 수 있습니다.


JSON은 표준 시간대 정보가 추가 된 Javascript 날짜를 사용합니다. 신기원은 명백한 이유로 Javascript Date 클래스의 신기원과 동일합니다.
BrainSlugs83

3
@ BrainSlug83-이 답변은 JSON에 내장 날짜 유형이 없다는 주장에 대한 참조를 제공합니다. 동의하지 않으면 대체 참조를 제공하십시오. (날짜를 나타 내기 위해 문자열 형식을 결정한 특정 프레임 워크를 생각하지 않고 있습니까? JSON 표준의 일부가 아니며 실제로는 그렇지 않은 문자열을 포함시킬 수 없기 때문에 불가능했습니다. 날짜로 간주되지만 날짜 패턴과 일치하는 문자 집합이
생깁니다

25

또한이 문제에 대한 해결책을 찾아야했고 결국이 날짜 형식을 구문 분석 할 수있는 멋진 라이브러리 인 moment.js를 발견했습니다.

var d = moment(yourdatestring)

그것은 당신을 위해 그것을 공유 할 것이라고 생각 그래서 나를 위해 두통을 저장했습니다. :)
여기에 대한 자세한 정보는 http://momentjs.com/ 에서 찾을 수 있습니다 .


24

인라인 스크립트에 객체를 쓸 때 Microsoft serializer가 생성 한 것을 제거하기 위해 "문자를 Panos의 정규식에 추가했습니다."

따라서 C # 코드 뒤에 속성이 있으면 다음과 같습니다.

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

그리고 당신의 aspx에는

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

당신은 같은 것을 얻을 것입니다

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

큰 따옴표를 주목하십시오.

이것을 평가가 올바르게 역 직렬화하는 형태로 만들기 위해 다음을 사용했습니다.

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

내가 사용하는 프로토 타입을 그것을 사용 I 추가하기

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

22

jQuery 1.5에서 이전 브라우저를 다루기 위해 json2.js 가있는 한 다음과 같이 Ajax에서 오는 모든 날짜를 직렬화 해제 할 수 있습니다.

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

서버에서 모든 날짜를 UTC로 보내야한다고 가정하는 논리를 포함 시켰습니다. 그런 다음 소비자는이 Date를 반영하기 위해 적절한 눈금 값 이있는 JavaScript 객체 를 가져 옵니다. 즉, getUTCHours()날짜 등을 호출 하면 서버에서 수행 한 것과 동일한 값 getHours()이 반환되고 브라우저를 통해 결정된대로 사용자의 현지 시간대 값이 반환됩니다.

표준 시간대 오프셋을 사용하는 WCF 형식은 고려하지 않지만 비교적 쉽게 추가 할 수 있습니다.


참고로 : 코드가 작동하려면 문자열 유형의 startsWith 메소드를 작성해야합니다.
Hugo Zapata

21

jQuery UI 날짜 선택기 사용-이미 jQuery UI를 포함하고있는 경우에만 의미가 있습니다.

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

산출:

2008 년 10 월 15 일


20

이것을 지나치게 생각하지 마십시오. 우리가 수십 년 동안 해왔 듯이 1970 년 1 월 1 일 자정 GMT / UTC / & c의 사실상 표준 시대에서이 시대 이후의 초 (또는 밀리 초) 단위로 숫자 오프셋을 전달하십시오. JavaScript는 그것을 좋아하고, Java는 그것을 좋아하고, C는 그것을 좋아하고, 인터넷은 그것을 좋아합니다.


2
그리고 너무 나쁜 것은 선택할 수있는 20 개 이상의 시대가 있습니다. en.wikipedia.org/wiki/Epoch_(reference_date)
Jerther

그것은 표준에 대한 좋은 것 입니다.
Marc L.

18

이 답변의 모든 사람은 공통점이 있습니다. 모두 날짜를 단일 값 (보통 문자열)으로 저장합니다.

다른 옵션은 JSON의 고유 구조를 활용하고 날짜를 숫자 목록으로 표시하는 것입니다.

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

물론, 대화의 양쪽 끝이 형식 (년, 월, 일)과 어떤 필드가 날짜가되어야하는지 동의해야합니다. 그러나 날짜 문제를 완전히 피할 수 있다는 이점이 있습니다. 문자열 변환 문자열이 아닌 모든 숫자입니다. 또한 연도, 월, 일 순서를 사용하면 날짜별로 정렬 할 수도 있습니다.

상자 밖에서 생각하면 JSON 날짜를 문자열로 저장할 필요가 없습니다.

이 방법으로 수행하는 또 다른 보너스는 CouchDB 가 배열 값에서 쿼리를 처리 하는 방식을 활용하여 주어진 연도 또는 월의 모든 레코드를 쉽고 효율적으로 선택할 수 있다는 것 입니다.


은 RFC 3339 형식입니다 JSON에 날짜를위한 표준 형식.
gnasher729

@ gnasher, 그것은 좋을 것이지만, 그렇지 않습니다. RFC 7159에서 3339까지의 참조는 없으며 그 반대도 마찬가지입니다. 더 없다 합법적 표준 JSON 날짜 형식은. 남은 것은 사실상 표준이며 각각의 장단점이 있습니다. 그것은 표준에 대한 좋은 것입니다.
Marc L.

17

멋진 스레드에 게시 :

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

1
좋은 생각이지만 시간대 오프셋이 포함되어 있다면 어떨까요? 이 경우 slice (6, -2) 대신 substr (6)을 사용하는 것이 좋습니다. 아래 답변을 참조하십시오.
Roy Tinker

17

여기에 다른 접근 방식을 추가 하기 위해 WCF에서 수행 하는 "틱 접근 방식" 은 여기에 설명 된 것과 같이 매우주의를 기울이지 않으면 시간대에 문제가 발생하기 쉽습니다 . 그래서 이제는 표준 시간대 오프셋을 포함하는 .NET 및 JavaScript가 제대로 지원하는 ISO 8601 형식을 사용하고 있습니다. 세부 사항은 다음과 같습니다.

WCF / .NET에서 :

여기서 CreationDate는 System.DateTime입니다. ToString ( "o")이 ISO 8601 호환 날짜 문자열을 생성하는 .NET의 왕복 형식 지정자 를 사용하고 있습니다.

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

자바 스크립트에서

JSON을 검색 한 직후 ISO 8601 날짜 문자열을 허용하는 Date 생성자를 사용하여 날짜를 JavaSript Date 객체로 수정합니다 ...

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

JavaScript 날짜가 있으면 toDateString , toLocaleString 등과 같은 편리하고 안정적인 Date 메소드를 모두 사용할 수 있습니다 .


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

jQuery 라이브러리를 사용하지 않는 다른 옵션이 있습니까?


이것은 새로운 질문이며 여기에 포함되지 않은 자체 질문으로해야합니다.
스펜서 설리반

11

이것은 또한 당신을 도울 수 있습니다.

 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

다음은 JSON 날짜를 구문 분석하는 매우 간단한 솔루션입니다. 요구 사항에 따라 아래 기능을 사용하십시오. 매개 변수로 가져온 JSON 형식 날짜를 아래 함수에 전달하면됩니다.

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

JavaScript 라이브러리 moment.js를 사용할 수도 있습니다.이 라이브러리 는 다른 현지화 된 형식을 처리하고 날짜 값으로 다른 작업을 수행 할 때 유용합니다.

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

현지화 설정은 프로젝트에 구성 파일 (momentjs.com에서 제공)을 추가하고 언어를 구성하는 것만 큼 쉽습니다.

moment.lang('de');

9

나는 이런 날짜를 얻는다 :

"/Date(1276290000000+0300)/"

일부 예에서 날짜는 약간 다른 형식입니다.

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

기타

그래서 다음 RegExp을 생각해 냈습니다.

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

최종 코드는 다음과 같습니다.

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

도움이 되길 바랍니다.

업데이트 : Microsoft 에서이 링크를 찾았습니다 .JSON으로 날짜를 직렬화하려면 어떻게합니까?

이것은 우리 모두가 찾는 것 같습니다.


1
정규식 대체는 느리다 ... substr (6)을 사용하여 정수 부분을 잡고 parseInt ()에 전달하는 것이 훨씬 빠릅니다. 아래 답변을 참조하십시오.
Roy Tinker


9

날짜 ISO 표준을 확인하십시오. 이런 종류의 :

yyyy.MM.ddThh:mm

됩니다 2008.11.20T22:18.


JSON 스키마에 따르면 "날짜-시간"형식은 RFC 3339, 섹션 5.6에 해당합니다. 따라서 GMT 날짜의 경우 "yyyy-MM-ddTHH : mm : ssZ"를 쓰거나 Z는 + hh : mm과 같은 시간대로 대체해야합니다.
gnasher729

문제는 WCF 및 기타 "이전"MS JSON 직렬화가이 형식을 사용하지 않으므로이를 고려해야한다는 것입니다.
Marc L.

9

실망 스럽습니다. 내 솔루션은 ASP.NET의 JavaScriptSerializer에서 생성 된 값에서 "/ 및 /"를 구문 분석하여 JSON에 날짜 리터럴이 없을 수는 있지만 여전히 브라우저에서 날짜로 해석합니다. 필요:{"myDate":Date(123456789)}

DateTime 용 사용자 정의 JavaScriptConverter?

Roy Tinker의 의견의 정확성을 강조해야합니다. 이것은 유효한 JSON이 아닙니다. JavaScript에서 문제가되기 전에 서버에서 문제를 제거하는 것은 더럽고 더러운 해킹입니다. JSON 파서를 질식시킵니다. 나는 그것을 땅에서 내리기 위해 사용했지만 더 이상 이것을 사용하지 않습니다. 그러나 여전히 가장 좋은 대답은 서버가 날짜를 형식화하는 방법 (예 : 다른 곳에서 언급 한 ISO)을 변경하는 것입니다.


2
그것은 합법적 인 JSON이 아닙니다. Javascript 인터프리터와 평가할 때만 작동합니다. 그러나 JSON 디코더를 사용하는 경우 질식합니다.
Roy Tinker

1
동의했다. 그리고이 한 가지 데이터 만 처리한다면 고려하지 않을 것입니다. 그러나 여러 날짜와 다른 속성의 객체를 다루는 경우 한 번에 하나씩 속성을 선택하는 것보다 모든 것을 평가하는 것이 더 쉽습니다. 결국 근본적인 문제는 (법적) JSON 날짜가 없다는 것입니다. 그것이 존재할 때까지, 우리는 창조적 인 해킹에 맡겨져 있습니다.
StarTrekRedneck

8

늦은 게시물이지만이 게시물을 검색 한 사용자에게 적합합니다.

이것을 상상해보십시오 :

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

보시다시피, "자동"제네릭을 만드는 데 C # 3.0의 기능을 사용하고 있습니다. 조금 게으르지 만 좋아하고 작동합니다. 참고 사항 : 프로필은 웹 응용 프로그램 프로젝트를 위해 만든 사용자 지정 클래스입니다.


따라서 새로운 역할 [Authorize (Roles = "Human Resources")]을 추가 할 때마다 컴파일 및 배포해야합니까? 와우 .... :)
Alex Nolasco

1
이것이 JSON 서비스 인 경우 리디렉션이 잘못된 것 같습니다. 입력 키가 너무 유효하지 않으면 404 찾을 수 없음을 반환하고 찾을 수 없습니다 (정확히 찾을 수없는 경우 404). 사용자가 로그인하지 않으면 403 Forbidden을 반환합니다.
Richard Corfield

"재사용 가능한"방법입니다. 예를 들어 다른 View에서 사용자 데이터를 가져 오려면 Id를 제공하는 한 얻을 수 있습니다. 그러나 ID가 제공되지 않으면 페이지가 사용자 목록 (색인)으로 리디렉션되어 사용자를 선택합니다. 당시 내 두뇌가 그것을 요리 한 방식으로 앱에 필요한 간단한 솔루션.
Ray Linder

8

참고로, 서버 측에서 Python을 사용하는 모든 사람에게 : datetime.datetime (). ctime ()은 "new Date ()"로 기본적으로 구문 분석 할 수있는 문자열을 리턴합니다. 즉, 새로운 datetime.datetime 인스턴스를 작성하면 (예 : datetime.datetime.now와 같이) 문자열을 JSON 문자열에 포함시킨 다음 해당 문자열을 Date 생성자에 첫 번째 인수로 전달할 수 있습니다. 아직 예외를 찾지 못했지만 너무 엄격하게 테스트하지는 않았습니다.


8

Mootools 솔루션 :

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

mootools-more가 필요합니다. Firefox 3.6.3 및 IE 7.0.5730.13에서 mootools-1.2.3.1-more를 사용하여 테스트


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

8

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

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

8

.NET이 반환 하면 어떻게됩니까 ?

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

그리고 JavaScript에서 ...

var x = new Date("2013-09-17 15:18:53Z");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.