2010-03-26 5 views
2

Ruby에서 JSON을 통해 Javascript로 날짜를 전달하고 있습니다.Javascript에서 JSON 날짜의 형식을 지정하는 방법은 무엇입니까?

자바 스크립트에는 "2010-03-24T10 : 00 : 00Z"로 제공됩니다.

이제 Javascript에서 어떻게 그 서식을 지정할 수 있습니까?

+1

는 http://stackoverflow.com/questions/2479714/does-javascript-ecmascript3-support-iso8601-date-parsing –

+0

감사를 참조하십시오,하지만 작동, 또는 무엇을합니까 거기에 아무것도 찾지 못하는거야 I 필요. 작동하는 것처럼 보이는 것은 '또 다른 예쁜 날짜 자바 스크립트'이지만 '내가 2 일 전'과 같은 정보를 반환하기 때문에 원하는 정보가 아닙니다. – 99miles

+1

형식을 지정할 수 있기 전에 먼저 구문 분석을 수행하십시오. –

답변

1

은 내가 먼저 날짜 객체를 생성하기 위해 다음과 같이 좀 그것을 할 거라고 생각 :

function dp(dateStr) { 
    var pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/; 
    var match = pattern.exec(dateStr); 
    if (!match) {throw new Error('::Error, #dp could not parse dateStr '+dateStr);} 
    // we're safe to use the fields 
    return new Date(match[1], match[2]-1, match[3], match[4], match[5], match[6]); 
} 
console.log(dp('2010-03-24T10:00:00Z')); 

는 그럼 난 다른 방식으로 그것을 꽤 - 인쇄 할 수 있습니다. 일치하는 배열 (idx 2 인 필드)의 날짜 (예 : 날짜 필드)가 0 인 색인으로 인해 어떻게 처리되어야하는지 확인하십시오.

+1

(-1) 정규식으로 날짜를 파싱하는 것은 일반적으로 좋지 않습니다. 모든 변형을 설명하기가 어렵습니다. 일반적으로 문제를 본격적으로 다루는 API에 맡기는 것이 가장 좋습니다. 더 나은 대안을 위해 @Crescent가 게시 한 의견을 참조하십시오. – harschware

+1

Eh? 아주 잘 알려진 형식의 꽤 잘 정의 된 작업이었습니다. 'Date.parse' 함수는 신뢰할 수 없습니다. 표준에 "2010-02-23T23 : 04 : 48Z"와 같은 문자열을 사용해야한다고하는 내용은 없습니다. 그래서 우리는 정규식을가집니다. 물론 더 많은 검사가 필요했기 때문에 (검색된 각 필드의 경계를 확인하십시오.) – npup

+0

+1 @harschware 날짜 표현은 표준화 된 형식 (RFC822, RFC3339, ..)에도 높은 수준의 변동성이 포함되어 있으며 대개 날짜를 나타내는 데 사용되는 사양이 동반되지 않으므로 완전히 손상되지 않습니다. 표준화 된 파서를 쓸 수 없기 때문에 기본적으로 다양한 형식을 시도하고 있습니다. 문제의 형식은'ISO 8601'입니다. 표준화되어 있으며 정규식으로 파싱하는 데 문제가 없습니다. 정규 표현식은 악조건이 아닙니다. – Anurag

2

EcmaScript 5 사양에 따르면 JSON 날짜는 ISO 문자열로 인코딩되어야합니다.

function f(n) { 
    // Format integers to have at least two digits. 
    return n < 10 ? '0' + n : n; 
} 

Date.prototype.toJSON = function (key) { 
    return isFinite(this.valueOf()) ? 
    this.getUTCFullYear() + '-' + 
    f(this.getUTCMonth() + 1) + '-' + 
    f(this.getUTCDate())  + 'T' + 
    f(this.getUTCHours())  + ':' + 
    f(this.getUTCMinutes()) + ':' + 
    f(this.getUTCSeconds()) + 'Z' : null; 
}; 

다행히도 루비 날짜 같은 방법으로 인코딩하는 것 :이 같은 자바 스크립트 날짜 개체의 toJSON이 볼 수있는 방법입니다.

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

이 모든 표준을 준수 JSON 구현과 작동합니다 : 우아한 해결책은 날짜 객체로 ISO 날짜 문자열을 변환하는 JSON 구문 분석 기능에 자극성 기능을 제공하는 것입니다.

두 샘플 모두 Douglas Crockford의 json2 소스 코드에서 가져온 것입니다.

2

날짜가 아닌 타임 스탬프로 전달하고 1000을 곱하면 어떨까요?

new Date(ruby_val * 1000); 
+0

나는 이것이 훨씬 더 합리적이라고 생각한다. Unix 타임 스탬프를 출력하기 위해 Rails 모델에서'as_json'을 재정의하고 클라이언트 측에서는 유닉스 타임 스탬프에서 날짜 객체를 생성하면됩니다. –

관련 문제