2013-07-22 6 views
5

GMT 시간 [2013-07-19 10:12:56]에 MySQL 데이터베이스에 타임 스탬프가 있습니다. DateTime 및 UTC로 DB에 있어야하지만 불행히도 이것이 방법입니다.MySql TimeStamp 및 JavaScript Time

타임 스탬프를 추출하고 JavaScript [HighCharts]로 전달해야합니다. 자바 스크립트 따라서 곱셈 구입 밀리 초 시간이 걸린다 같이

$time = strtotime('2013-07-19 10:12:56'); 
echo("Converting to UNIX Time: ");echo $time; 
echo("Converting to JS Time: ");echo ($time*1000); 

1,000

출력 : UNIX 시간으로 변환 : 1374253976

출력 : JS로 변환 : 시간 : 1,374,253,976,000

내가 가지고있는 질문은 HighCharts에서 17.12와 같이 표시되는 이유는 무엇입니까?

내가 http://www.epochconverter.com에 1374253976000을 넣었을 때 나는
GMT : Fri, 19 Jul 2013 17:12:56 GMT가 맞지 않습니다. 시간은 데이터베이스에 10시 12 분 56 초로 표시되는 것처럼 나타납니다.

왜 7h 아웃이 될지 궁금하십니까?

+0

당신은 UTC 시간을 사용하지 봤어 (http://api.highcharts.com/highstock#global.useUTC) –

+0

예 그러나 그것 여전히 7 시간 미래. var highchartsOptions = Highcharts.setOptions (Highcharts.theme, { global : {useUTC : false}}); – DevilCode

+0

새로운 날짜 (1374253976000)를 실행할 때 이상하게도 올바른 데이터 (귀하의 것)입니다. –

답변

10

EpochtimeconverterFri, 19 Jul 2013 10:12:56 GMT

Epoch timestamp: 1374228776 
Timestamp in milliseconds: 1374228776000 
Human time (GMT): Fri, 19 Jul 2013 10:12:56 GMT 
Human time (your time zone): Friday, July 19, 2013 3:42:56 PM 

주 획기적인 번 다음했다 당신이지고, 그것은이 하지1374253976 있다고 말한다. 그래서 그 문제는 epochtime에서 highcharts 로의 변환 등이 정확합니다. 그것은 틀린 시간대입니다.

PHP는 다르게 언급하지 않는 한 문자열을 서버의 시간대로 처리합니다. 이 시도해

$time = strtotime('2013-07-19 10:12:56' . ' GMT'); 
echo("Converting to UNIX Time: ");echo $time; 
echo("Converting to JS Time: ");echo ($time*1000); 

당신이 당신의 서버가 시간대 -7에 위치하기 때문에 될 수있다 관찰 하였다 7 시간 차이를 다음과 같이 GMT 명시 적으로 시간대를 지정?

+0

도움을 주셔서 감사합니다. 서버가 실제로 -7 시간대에있었습니다. – DevilCode

+0

@DevilCode 당신이 가장 환영합니다 :) –

2

문제 # 1

주요 문제는 전환 단계는 strtotime를 사용하여입니다. PHP는 시간대와 시간대 (아마 당신의 시간대를 사용)의 관계를 추측하려하지만, 상황에 따라 추측하기에 더 많은 것을 알 필요가 있습니다. 시간 문자열이 GMT (그리니치 표준시)로 표시된다는 것을 명시 적으로 PHP에 알려줌으로써이를 수행 할 수 있습니다.

데이터베이스의 형식은 YYYY-MM-DD HH : MM : SS 형식이므로 strtotime 호출 중에 데이터베이스에 필요한 GMT 식별자를 연결할 수 있습니다.

<pre> 
<?php 
    $time = strtotime('2013-07-19 10:12:56' . ' GMT'); 
    echo("Converting to UNIX Time: $time\n"); 
    echo("Converting to JS Time: "); 
    echo ($time*1000); 
?> 
</pre> 
은 UNIX 시간으로 변환 :
1,374,228,776는 JS 시간으로 변환 : 1,374,228,776,000

를 에포크 변환 결과로 얻어진 UNIX 시간 붙여 예

$time = strtotime('2013-07-19 10:12:56' . ' GMT'); 

GMT: Fri, 19 Jul 2013 10:12:56 GMT

에서 올바르게

문제 # 2

로 위의 PHP 코드를 변경하는 것은 필요하지만 완전히 당신을 위해 작동하지 않기 때문에, 나는 당신이 한 번 더 문제가 일어나고있는 것을 볼 수 있습니다. (Sebastian이 도움을 주려고했습니다.)

Sebastian의 설명에 을 추가하면 JavaScript에서 차트 또는 차트 개체를 만들기 전에 전역 설정을 구성해야한다는 것입니다. 그렇지 않으면 차트의 출력에 영향을 미치지 않습니다. 따라서 앞에 코드가 존재하는지 확인하기 위해 다음 구성을 적용해야합니다.

Highcharts.setOptions({ 
    global: { 
     useUTC: false 
    } 
}); 

(이 구성을 사용하지 않는 경우, 차트는 여전히 잘 작동하지만 날짜와 시간 대신 차트를 보는 각 사용자의 로컬 시간대의 그리니치 표준시를 기준으로 표시됩니다.)

토론 (없는 토론을 미워하는 사람들을 위해 나중에 배치 그것을 읽기) :

나는 당신이 당신의 PHP 코드를 위의 제안 수정 다음과 같은 경우에, 당신은 지금 올바른 UTC가 있다는 것을 확인/GMT 숫자 에포크 시간은 JavaScript로 전달됩니다.

Date.UTC(2013, 6, 19, 10, 12, 56) 
1374228776000 
new Date(1374228776000).toUTCString() 
"Mon, 19 Aug 2013 10:12:56 GMT" 

당신은 분명히 직면하고있는 두 번째 문제는 두 가지입니다 : 다음과 같은 코드로 확실히이 100 % 확인할 수 있습니다 만드는 Highcharts가 제대로 오히려 다른 어떤에서 값보다 UTC/GMT 값으로이 해석 (예 : 로컬) 시간대를 표시하고, 원하는 형식으로 표준 시간대를 올바르게 출력하도록 Highcharts에 알립니다.

는 Highcharts 제대로 시간 번호 해석 만들기 : 기본 Highcharts으로하는 것은 이와 같은 숫자 시간 데이터는 UTC에 가정 [[1331028000000, 5], [1331031600000, 6], [1331035200000, 4]. 자바 스크립트에 이상한 것을 숨기고 시간 데이터를 처리하는 방법을 변경하지 않는 한, 당신은 그 점에서 잘해야합니다.

만들기 Highcharts이 차트에 사람이 읽을 수있는 날짜에 정확한 시간을 표시 : 당신이 여기에 API에 세심한 관심을해야하는 곳은 다음과 같습니다 그런데 http://api.highcharts.com/highcharts#global.useUTC

, 세바스찬 Bochan는의 일원이다 Highcharts는 팀을 지원하므로 그의 의견을 확실히 신뢰할 수 있습니다.

+1

미안하지만, 글자 그대로 답변을 클릭하기 전에 Jugal의 나머지 답변을 읽지 않았습니다. (아직 해결책을 보지 못했기 때문에 "그게 문제입니다"라는 말에 대해 멈췄습니다.) 나는 그가 그의 대답 전부를 읽는 것을 끝내었다면 그는 똑같은 것을 제안했다고 보았을 것이다. 죄송합니다. 나는 그것이 더 명확한 설명이라고 생각하기 때문에 대답을 떠날 것이다. (그리고 나는 그것을 시험해 보지 않고 시험했다.) 그러나 Jugal은 그 현상금을 주장 할 권리가있다. –

+0

도움에 감사드립니다. – DevilCode

+0

@DevilCode 대단히 환영합니다! 남은 문제가 있다면 알려주십시오. 해결해 주시면 기꺼이 도와 드리겠습니다. –

0

시간대 문제가 있습니다.GMT에서 타임 스탬프 2013-07-19 10:12:56은 시대 이후 1374228776초로 변환 :

출력 : UNIX 시간으로 변환 : 1374253976

으로 http://jsfiddle.net/hsvtE/

귀하의 PHP 스크립트는 그러나 잘못된 유닉스 시간을 반환 두 개의 타임 스탬프의 차이점은 다음과 같습니다.

1374253976 (incorrect) 
-1374228776 (correct) 
----------- 
     25200 seconds 

PHP 스크립트가 반환하는 시간은 GMT 시간보다 25200 초 (또는 7 시간) 앞입니다. PHP가 잘못된 시간을 반환하는 이유는 strtotime 함수가 작동하는 방식 때문입니다.

시간 소인에 시간대가 지정되지 않은 경우 strtotime은 시간 소인이 기본 시간대에 속한다고 가정합니다.

방법 1 : GMT

에 기본 시간대

를 설정 당신은 얻을 기능 date_default_timezone_getdate_default_timezone_set를 사용하여 PHP의 기본 시간대를 설정할 수 있습니다

이 문제를 해결하는 데는 두 가지 방법이 있습니다. 다음과 같이이 두 가지 기능을 사용하면 당신은 당신의 타임 스탬프에 대한 올바른 시간대를 설정할 수 있습니다 :

function get_time($timestamp, $timezone = 'GMT') { 
    $default_timezone = date_default_timezone_get(); // get current timezone 
    date_default_timezone_set($timezone);   // set correct timezone 
    $time = strtotime($timestamp);     // get correct time 
    date_default_timezone_set($default_timezone); // reset original timezone 
    return $time;         // return correct time 
} 

이제 안전하게 단순히 get_time 대신 strtotime를 호출하여 GMT에서 정확한 시간을 얻을 수 있습니다

$time = get_time('2013-07-19 10:12:56'); 

내가 추천 타임 스탬프가 이미 시간대를 지정하면 strtotime은 단순히 기본 시간대를 무시하고 대신 지정된 시간대를 사용하므로이 방법을 사용합니다.

방법 2 : 타임 스탬프 자체

두 번째 방법에서 시간대를 지정 훨씬 짧은 :

function get_time($timestamp, $timezone = 'GMT') { 
    return strtotime($timestamp . ' ' . $timezone); 
} 

$time = get_time('2013-07-19 10:12:56'); 

나는 당신이 더 안전 대신하기 때문에 첫 번째 방법을 사용하는 것이 좋습니다 것입니다 그러나. 예를 들어 타임 스탬프 2013-07-19 10:12:56 EST을 제공 한 경우 위의 함수는 strtotime을 두 개의 시간대 - 2013-07-19 10:12:56 EST GMT이있는 문자열로 호출합니다.

결론

이 간단한 변경으로 문제가 해결됩니다. 당신이 시간 (밀리 초)을 원하는 경우 단순히 1000하여 시간을 곱 : 나는 클라이언트 측 코드가 올바른지 믿고있어

$time = 1000 * get_time('2013-07-19 10:12:56'); 

. 그러므로 여전히 문제가 있다면 자바 스크립트를 살펴 봐야합니다.

0

실제로 JS 문제가 아닙니다. 트릭은 PHP에 있으며 기본 시간대와 관련하여 "strtotime"이 변환을 수행하는 방법에 대해 설명합니다.

예에서 타임 스탬프는 "America/Los_Angeles"시간대 인 것처럼 계산되므로 1374228776 대신 "10"이 표시되고 "GMT"가 표시됩니다. EPT 변환기에서 타임 스탬프를 GMT 시간대로 상대적으로 변환하기 때문에 "불일치"가 나타납니다.

MySQL에 저장하는 데이터의 GMT는 PHP 설치 시간대가 "America/Los_Angeles"입니다. "strtotime"할 때 GMT가 아닌 MYSQL에 데이터를 보간하지만 America/Los_Angeles. 그래서 둘 사이에는 7 시간이 걸립니다.

date_default_timezone_set('GMT'); 

echo strtotime('2013-07-19 10:12:56', time() - 10) . "\n"; 

date_default_timezone_set('America/Los_Angeles'); 

echo strtotime('2013-07-19 10:12:56', time() - 10) . "\n"; 

가 표시됩니다 : 순서가 "287"을 순서 "539"로 대체하는 방법을

1374228776 // from epochconverter : Fri, 19 Jul 2013 10:12:56 GMT 
1374253976 // from epochconverter : Fri, 19 Jul 2013 17:12:56 GMT 

공지 사항 여기

조금 더 나은 이것을 설명하는 스크립트입니다.

PHP에서, 거의 모든 함수 조작 시간은 현재 정의 된 시간대를 기반으로합니다. 더 많은 정보를위한 이것

봐는 :

PHP Default TimeZone