2016-11-02 2 views
0

날짜 정보를 밀리 초 단위로 가져옵니다. 나는 그것을 올바르게 파싱 할 수있다. 하지만 내 PC 시간대를 변경할 때 파싱 된 시간도 변경됩니다. 나는 단지 특정 시간대에만 원한다.자바 스크립트 날짜를 특정 시간대로 변환하는 방법

EX. 여기 Tue Apr 26 2016 14:15:00 GMT+0930 (Local Standard Time)

난 단지 실제 시간을 원하는 : PC의 시간대가 될 변경

Time in millisec: 1461645900000 
Actual Parsed: 26-Apr-2016 10:15:00 IST 

. 그것을 얻는 방법? .하지만 제한 : 나는 새 Date() toLocaleString ("EN-US", { ""표준 시간대})를 사용했다

function parseDateTime(dt, format) { 
    var months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", 
      "Sep", "Oct", "Nov", "Dec" ]; 
    var ret = ""; 
    if (dt) { 
    var day="",month="",year="",hour="",mins="",secs=""; 
     var d = new Date(dt) 
     var os=d.getTimezoneOffset(); 
     if(os<0){ 

     } 
     ret += d.getDate() + "-" + months[parseInt(d.getMonth())] + "-" 
       + d.getFullYear() + " " + leftPad(d.getHours(), 2, "0") + ":" 
       + leftPad(d.getMinutes(), 2, "0") + ":" 
       + leftPad(d.getSeconds(), 2, "0"); 
    } 
    document.getElementById("d1").innerHTML=ret; 
    console.log(ret); 
} 
function leftPad(number, targetLength, withWhat) { 
    var output = number + ''; 
    while (output.length < targetLength) { 
     output = withWhat + output; 
    } 
    return output; 
} 
parseDateTime(1461645900000); 

:

여기에 내 작은 시도이다. 또한 나는 새로운 lib에 관심이 없다.

+0

이 라이브러리가 있습니다. http://momentjs.com/ – Skizo

+0

@Skizo : lib를 사용하고 싶지 않습니다. 나는 논리의 추가 힌트를 원한다. – Joe

+0

자바 스크립트 날짜에는 시간대가 없으며 항상 UTC입니다. 호스트 시스템에는 시간대가 있으며 Dates는 "로컬"시간과 관련된 계산에이를 사용합니다. – RobG

답변

2

밀리 초를 지날 때 시간대와 상관없이 동일한 시간을 가져 가고 싶다는 사실을 알고 있습니다. 대신 다음 두 줄의

var d = new Date(dt) 
    var os = d.getTimezoneOffset(); 

당신은 아래 라인을 포함

var os = new Date() 
    os = os.getTimezoneOffset(); 
    var d = new Date((dt + (os * 60 * 1000))); 

이 로컬 시간대에 따라 UTC 시간에 밀리 초를 조정하고 조정 된 UTC에서 날짜 객체를 생성 시간이므로 현지 시간대와 관계없이 항상 같은 시간을 갖습니다.

+0

밀리 초 **는 ** UTC입니다. 당신이하고있는 일은 현지 시간대를 보완하기 위해 시간 값으로 변경하여 "로컬"은 UTC와 비슷하지만 실제로는 다른 시간을 나타냅니다. – RobG

+0

네가 맞다. 분명히 다른 시간을 보게 될 것이다. mm 그러나 그때 나는 당신이 찾고있는 것을 얻지 못했습니다. – Karpak

+0

네,이 방법을 시도하고 ans는 약간 O2를주었습니다 ... 어쨌든 max an ans는 diff이지만. 하지만 나는 urs를 받아들입니다. – Joe

6

표현의 차이는 혼동 스럽습니다. 번입니다. 1461645900000은 단 한 번뿐입니다. 우주의 모든 곳에서 동일합니다. 별이 특정 방식으로 정렬되고 우주가 그 진행의 특별한 시점에있는 것은 마법의 순간입니다.

시간대는 의 기능이며, 날짜는입니다. 도쿄에 살면 아마 도쿄 시간에 보는 것을 더 좋아할 것입니다. 캘리포니아에 살면 캘리포니아 시간대에 내 시간을 보길 선호합니다. 이러한 현지 시간 표현은 현지 시간과 UTC로부터의 오프셋으로 구성되므로 적절히 해석 할 수 있습니다.

JS로 날짜를 인쇄하거나 출력 할 때 종종 문자열로 바뀌는 것은 표현인데 그 문자열은 지구상의 어느 곳에서나 상대적인 위치에 있어야합니다. , 오프셋에 상대적입니다. 기본 JS 동작은 로컬 컴퓨터에서 설정 한 바로 그 위치에 오프셋을 사용하는 것입니다. 그런 이유로 컴퓨터가 인도 시간으로 설정된 경우 'Tue Apr 26 2016 10:15:00 GMT + 0530 (인도 표준시)'과 같은 것을 볼 수 있습니다. date.toISOString은 "2016-04-26T04 : 45 : 00.000Z"("Z"는 UTC를 의미 함) 또는 date.toUTCString으로 로컬 시간대를 무시하고 "UTC" Tue, 2014 년 4 월 26 일 04:45:00 GMT "

그냥 완성도, 사람들은 매우 일반적 오프셋시간대을 혼동. 시간대는 특정 지역에 대한 시간 경과에 따른 모든 오프셋 (DST의 경우와 같이 변경할 수 있음)의 전체 기록입니다. 실제로 인디애나의 일부 도시에는 1929 년 DST를 거친 시간대를 포함하여 수백 가지 다른 시간대가 있습니다.시간대 데이터를 관리하려면 시간대와 별도로 데이터를 처리해야합니다. 오프셋이 발생하더라도 오프셋에서 시간대까지 고유하게 이동할 수있는 방법이 없습니다. 예를 들어 캘리포니아와 칠레는 서로 다른 시간대이지만 오프셋은 모두 -08 : 00입니다. 시간대를 올바르게 관리하려면 특별한 종류의 시간대 패키지를 사용해야합니다.

"시간대를 변경하고 싶다"는 사람들의 말을 자주 듣습니다. 시간대를 변경할 수 없습니다. 시간 자체에는 시간대가 없으며 단지 우주 시계에 불과합니다. 당신이 할 수있는 일은 표현을 특정 오프셋과 관련이 있도록 변경하는 것입니다. 예를 들어, 시도한대로 date.toLocaleString을 사용할 수 있습니다. 그것에 대해 "제한적"이라고 생각한 것은 무엇입니까?

> new Date().toLocaleString("en-US", {timeZone: "America/Los_Angeles", timeZoneName: "long"}) 
< "11/3/2016, 8:33:02 AM Pacific Daylight Time" 

timeZoneName: "short"을 사용하면 "PDT"가 출력됩니다. 그러나 "PDT"또는 "PST"또는 "IST"또는 그 외의 문자는 timeZone 옵션의 값으로 사용할 수 없습니다.이 세 문자 약어는 고유하지 않기 때문입니다. 예를 들어 'PST'는 '핏 케언 표준시'를 의미 할 수도 있습니다.

timeZone을 null 문자열로 사용하여 시도한 형식이 작동하지 않습니다 (알 수없는 표준 시간대 오류가 발생 함).

"IST"와 같은 문자열을 지정하려는 경우 어떻게해야합니까? 위에서 언급했듯이, 이것은 작동하지 않을 것이다; "IST"를 "Asia/Kolkata"에 매핑하는 방법을 찾아야합니다.이 라이브러리에는 일종의 라이브러리가 필요합니다. 어떤 종류의 오프셋을 지정하려면 어떻게해야합니까? 여기서도 오프셋 (offset)로부터 타임 존을 추측 할 수있는 일종의 라이브러리가 필요합니다.

결론은 날짜를 파싱하고,이 구성 요소를 조정하고, 문자열 연산과 다시 결합하는 경우 잘못되거나 불필요한 작업을 수행한다는 것입니다.

0

을 감안할 때 : millisec에서

시간 : 1461645900000

사용 날짜를 만드는 경우 :

new Date(1461645900000); 

다음 값이 1970-01로부터의 오프셋 (offset) 밀리 세컨드로 처리됩니다 -01T00 : 00 : 00Z이며 호스트 시스템 설정에 관계없이 동일한 시간을 나타냅니다.

실제 구문 분석 : 당신은 문자열로이 쓸 때 26 4 월 2016 다음

인도 표준시 10시 15분 0초

호스트 시스템의 시간대 설정은 "로컬"날짜를 만드는 데 사용되며, UTC 시간 값에서 시간 값. 동등한 UTC 날짜가 그래서, 30 : IST는 +05 UTC입니다

2016-04-26T04:45:00Z 

당신은 다른 다음 물론 다른를 볼 수 있습니다 오프셋 "로컬"시간이 일에 당신의 PC 시간대를 변경하는 경우 그러나 날짜의 내부 시간 값은 변경되지 않았으며 해당 날짜의 내부 시간 값도 변경되지 않았습니다.따라서 UTC + 09 : 30의 오프셋으로 변경하면 "로컬"시간이 4 시간 후에 다음과 같이 표시됩니다.

화요일 4 월 26 일 2016 14:15:00 GMT + 0930 (현지 표준시 당신이 말할 때)

그래서 : 여기

을 난 단지 실제 시간을 원한다. 그것을 얻는 방법? 즉

26-Apr-2016 10:15:00 IST (UTC+0530) 
Tue Apr 26 2016 14:15:00 GMT+0930 
2016-04-26T04:45:00Z 

시간의 순간에 대한 시간 영역에서 실제 시간

가 시간의 동일한 순간의 모든 다른 표현이다.

특정 시간대의 날짜를 나타내려면 UTC 메서드를 사용하여 UTC 시간을 필요한 오프셋으로 조정 한 다음 UTC 메서드를 사용하여 표시 할 날짜 및 시간 값을 가져올 수 있습니다.

관련 문제