2014-04-06 1 views
1

나는 공공 Google 캘린더에서 정보를 검색 할 수있는 Ajax 호출이 있습니다 기능 ProcessData(data)Google 캘린더 API에서 '하루 종일'이벤트를 검색 할 때 시간대 오프셋을 어떻게 계산합니까?

$.ajax({ 
     url: "https://www.google.com/calendar/feeds/{CalID}/public/full?start-min={StartTime}&start-max={endTime}&alt=json-in-script&callback=?"; 
     dataType: 'json', 
     timeout: 3000, 
     success: function(data) { ProcessData(data);}, 
}); 

I 다음 문이 : 날짜 A를 StartTimeDate() 객체를 저장

StartTime = new Date(data.feed.entry[i].gd$when[j].startTime); 

을 특정 이벤트가 시작됩니다. Google은 일반적으로 YYYY-MM-DDThh : mmTZD (예 : 1997-07-16T19 : 20 + 01 : 00)의 ISO 8601 시간 형식을 사용하며 정상적으로 작동합니다. 그러나 "하루 종일"이벤트의 경우 형식은 YYYY-MM-DD 형식 (예 : 1997-07-16) (W3 http://www.w3.org/TR/NOTE-datetime에서 허용)이며이 경우 new Date()은 GMT로 해석합니다. 즉, 현지 시간대에 이벤트가 이미 생성 된 경우에도 해당 날짜를 현지 시간대로 수정합니다. 그것은 2014 년 19 일 4월 6일 이전

new Date("2014-04-07") 

반환 5시간 것처럼 내 특정 경우에는, 내 시간대에 일어나고 말,에 "하루 종일"이벤트, 4 월 7 일 2014를 검색 할 때하는 문자열을 반환합니다 : 00:00 GMT-0500 (CDT) 시간은 5 시간입니다. (날짜 구문 분석에 대한 자세한 내용은 question을 참조하십시오.)

Google 캘린더를 사용할 때이 문제를 해결해 본 경험이 있습니까? 그렇다면 어떻게 해결 했습니까? 나는 실제로 시간대를 설명 할 새로운 Date() 대신 다른 방법을 사용해야합니까?

Google의 JSON 응답에는 Olson의 표준 시간대 ID가 포함 된 매개 변수 feed.timezone이 포함되어 있지만 ID가 실제 오프셋으로 변환 될 수있는 방법이 필요합니다. 이 포럼에서 다음 question을 찾았지만이 문제는이 API에 필요한 매개 변수가 실제 도시가 아니라 시간대 ID가 아니라 시간대 ID에서 도시로의 번역을 URL로 전달하도록 만드는 것입니다. 끈.

도움이 될 것입니다.

답변

0

오프셋이 "잘 작동합니다"ISO 8601 문자열을 말하면, Date 생성자까지 구문 분석을 떠날 것입니까, 아니면 직접 하시겠습니까? 일부 브라우저는 ISO 문자열을 올바르게 구문 분석하지 않으며 더 많은 문자열을 오프셋이있는 문자열로 올바르게 구문 분석하지 못합니다. 모든 브라우저에서 오프셋이있는 ISO 문자열을 구문 분석하는 방법을 보여주는 대답 here이 있습니다.

날짜 처리 방법과 관련해서는 비즈니스 논리 대답 만있는 문제입니다. ISO 8601 문자열로 해석되면 그리니치 표준시 서쪽 (또는 일광 절약 시간제 서쪽으로 1 시간 이상)에있는 모든 표준 시간대에서 하루 전 날짜가됩니다. 현지 날짜로 취급하려는 경우 먼저 문자열을 테스트하여 날짜가 맞는지 테스트해야합니다. 그렇다면 날짜를 현지 날짜로 처리하십시오. 현지 날짜로 문자열을 구문 분석

if (/^\d{4}-\d{2}-\d{2}/.test(dateString) { 
    // treat as date 
} else { 
    // treat as date and time 
} 

매우 간단하다 :

// Expect a date string in ISO 8601 format YYYY-MM-DD 
// Date is created as a local date 
function parseLocalDateTime(s) { 
    s = s.split(/\D+/g); 
    return new Date(s[0], --s[1], s[2]); 
}