2012-01-01 3 views
0

와 서버에서 클라이언트의 로컬 시간에이 같은 결과를 생성하는 쿼리가 또한 일반적인 'markers_name'요소는 함께 묶여 있습니다. (그들은 각 날짜에 대해서만 함께 덩어리로 처리됩니다). 변환 날짜와 시간을 UTC에서 MYSQL

은 그때 내가 본 쿼리에서 무엇입니까 행 세트에 그리스트에 가입, conditions에서 (markers_id, date)의 모든 조합에 대해 MAX(time) 값의 목록을 이렇게 및 정렬을 위해 MAX(time) 값을 사용하려면

SELECT 
    m.name AS markers_name, 
    c.time AS conditions_time, 
    c.date AS conditions_date, 
    s.name AS station_name 
FROM markers m 
    INNER JOIN conditions c ON c.markers_id = m.id 
    INNER JOIN station s ON c.station_id = s.id 
    INNER JOIN (
    SELECT 
     markers_id, 
     date, 
     MAX(time) AS time 
    FROM conditions 
    GROUP BY 
     markers_id, 
     date 
) mx ON c.markers_id = mx.markers_id AND c.date = mx.date 
ORDER BY 
    c.date DESC, 
    mx.time DESC, 
    m.name DESC, 
    c.time DESC 

날짜와 시간은 UTC 시간으로 MySQL 데이터베이스에 저장됩니다. 클라이언트는 자바 스크립트를 사용하여 날짜와 시간을 현지 시간대로 변환합니다. 대신 나는 PHP와 MySQL로 서버에서 변환을하고 싶습니다. 누구든지 MySQL 쿼리 (또는 아마 PHP 및 MySQL)를 사용하여이 작업을 수행하는 방법에 대한 제안을 제공 할 수 있습니까?

클라이언트는 서버에서이 데이터를 요청하기 위해 ajax를 사용하므로 javascript 메소드 인 getTimezoneOffset()을 사용하여 쿼리에 시간대 오프셋을 쉽게 포함 할 수 있습니다.

날짜는 별도의 날짜와이 코드를 사용하여 시간 필드를 사용하여 데이터베이스에 저장됩니다 나는 $ 시간 $ 날짜 대신 $ utc_timestamp 저장할 수 필요한 경우

// convert timestamp to seconds 
// time is provided by client as the number of milliseconds since January 1, 1970 00:00:00 UTC. 
$utc_timestamp = trim($_POST['utc_timestamp']); 
date_default_timezone_set('UTC'); 
$utc_timestamp = $utc_timestamp/1000; 
$time = date("H:i:s",$utc_timestamp); 
$date = date("Y:m:d",$utc_timestamp); 

을하지만 조금 무섭다 내 데이터를 저장하는 방식을 변경하십시오. 사전에

감사합니다 ....

답변

1

이것은 PHP로 내 문제를 해결 한 방법입니다.

클라이언트는 자바 스크립트와 오프셋 시간대 가져옵니다

var date = new Date(); 
var utcOffset = -date.getTimezoneOffset()/60; 

클라이언트가 아약스를 통해 서버에 오프셋 보냅니다을하고 서버가 가져 오는 오프셋 :

$utcOffset = isset($_REQUEST["utcOffset"]) ? $_REQUEST["utcOffset"] : 0; 
$pieces = explode(".", $utcOffset); 
$hours = $pieces[0]; 

// handle '.5' because some timezones include a half hour portion 
if (sizeof($pieces) == 1) 
    $minutes = 0; 
else 
    $minutes = '.' . $pieces[1]; 

// convert .5 to 30 
$minutes *= 60; 

if ($hours[0] == '-') 
    $minutes = '-' . $minutes; 

는 서버가 데이터베이스를 쿼리 (이것은 내 원래 게시물에 표시됩니다). 그럼 내 PHP는 결과를 통해 반복하고 클라이언트에 다시 보내 XML을 생산하고 있습니다.나는이 날짜 '2012-01-01'이 시간 '이 데이터베이스에 따라서

$time = date('g:i a', strtotime($hours . ' hours,' . $minutes . ' minutes', strtotime(date($row['conditions_date'] . $row['conditions_time'])))); 

$date = date('D, M j, Y', strtotime($hours . ' hours,' . $minutes . ' minutes', strtotime(date($row['conditions_date'] . $row['conditions_time'])))); 

: 그 루프 내에서, 나는 UTC에서 클라이언트의 현지 시간으로 날짜와 시간을 변환이 코드를 배치했다 20시 22 분 11 초. 위의 코드는 클라이언트가 -5 (동부 표준시 값)를 제공하는 경우 시간을 '3:22 pm'으로, 날짜를 'Sun, Jan 1, 2012'로 변환합니다.

1

당신은 사용자가 선택한 시간대에 UTC 타임 스탬프를 변환 localtime($utc_timestamp) 또는 date($utc_timestamp)와 함께 date_default_timezone_set()을 사용할 수 있습니다.

가능 PARAMATERS의 목록 date_default_timezone_set()에 대한 (시간대)은 여기있다 :

List of supported timezones

이 여전히이 같은 사용자의 시간대를 검색하는 클라이언트 측 스크립트 (자바 스크립트)의 일종을 사용하도록 요구합니다 정보는 클라이언트에 의해 서버로 전송되지 않습니다.

$utc_timestamp을 저장하는 것으로 변경하는 것이 좋습니다. 두 문자열을 비교할 수있는 시간의 일정한 척도이기 때문입니다. 나중에 다른 항목의 나이를 비교하는 것이 훨씬 쉬워집니다. .etc

+0

고마워요,하지만 전 꽤 따라 가지 않을까 걱정됩니다. 클라이언트의 시간대에 따라 데이터를 저장하려는 경우 이것이 어떻게 도움이되는지 이해합니다. 하지만이 방법으로 UTC 형식으로 저장된 데이터를 검색하고 클라이언트의 표준 시간대로 변환하는 데 어떻게 도움이되는지 이해할 수 없습니다. 좀 더 설명해 주시겠습니까? 데이터를 저장하는 방법을 변경해야합니까 (날짜와 시간 대신 타임 스탬프를 저장합니까?) 감사합니다. – user418775

+0

@ user418775 타임 스탬프로 저장하는 것이 더 낫겠지 만, 'mktime ($ hour, $ minute, $ second, $ month, $ day, $ year, $ is_dst)와 같은 타임 스탬프로 날짜를 변환 할 수 있습니다. http://ktp.net/manual/en/function.mktime.php –

+0

mktime 작동 - MySQL 쿼리에서 반환 된 행을 반복하고 데이터를 다시 포맷하면됩니다. 그러나 합병증이 있습니다. UTC 시간과 클라이언트 로컬 시간을 비교하면 특정 데이터 항목이 다른 날짜로 표시됩니다. 예 : '2 2011-12-31 17:11:49', '1 2011-12-31 18:19:35', '2 2012-01-01 03:46:12'과 같이 입력합니다. (각 문자열의 첫 번째 숫자는 위치입니다.) 이것을 EST로 변환하면 1 차 및 3 차 입력이 모두 12 월 31 일에 발생합니다. 따라서 이들을 함께 그룹화해야하지만, MySQL 쿼리는 UTC 시간을 기반으로하기 때문에 함께 그룹화하지 않습니다. – user418775

관련 문제