2012-01-01 19 views
0

と、サーバー上のクライアントのローカル時間に私はこのような結果を生成するクエリを持っています共通の 'markers_name'要素も一緒にチャンクされます。 (彼らは、日付ごとに一緒にチャンクされています)。これを行うには変換日時UTCからMYSQL

私は、私は現在、クエリから取得していた行セットにそのリストに参加し、ソートにMAX(time)値を使用し、conditions(markers_id, date)の組み合わせごと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データベースに保存されます。クライアントは、javascriptを使用して日付と時刻を現地時間帯に変換します。 代わりに私はPHPとMySQLでサーバー上で変換を行いたいと思います。誰かが私はMySQLのクエリ(またはおそらくPHPとMySQL)でこれを達成する方法についての提案を提供することはできますか?

クライアントはこのデータをサーバーから要求するために、javascriptメソッドgetTimezoneOffset()を使用して、タイムゾーンオフセットをクエリに簡単に含めることができます。

日は、このコードを使用して別の日付と時刻のフィールドを使用してデータベースに格納されます。

// 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); 

必要であれば、私は$時間と$日付の代わりに$ UTC_TIMESTAMPを格納することができますが、それはに少し怖いです私のデータを保存している方法を変えてください。

事前に感謝しますが....

答えて

1

.etc異なるエントリの年齢を比較したい場合、これが、私はPHPと私の問題を解決する方法であると言う将来的にはそれがはるかに容易になります。

クライアントはタイムゾーンはJavaScriptを使用してオフセットを取得します:

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

をクライアントがAJAXを介してサーバにオフセットし、サーバがフェッチオフセット送信:

$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を生成し、xmlはクライアントに返されます。そのループの中で、私はクライアントのローカル時刻にUTCから日付と時刻を変換し、このコードは、置かれている:

$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'])))); 

ように、データベースに、私はこの日「2012-01-01」と、この時間を "持っています20:22:11 '。上記のコードは、クライアントが-5(東部標準時間の値)を提供する場合に、時刻を '3:22 pm'に、日付を 'Sun、Jan 1、2012'に変換します。

1

あなたはあなたが選んだのタイムゾーンにUTCタイムスタンプを変換するlocaltime($utc_timestamp)またはdate($utc_timestamp)と一緒にdate_default_timezone_set()を使用することができます。 date_default_timezone_set()のために認められPARAMATERS(タイムゾーン)の

リストがここに発見された:

List of supported timezones

これはまだこのように、ユーザーのタイムゾーンを取得するために、クライアント側のスクリプト(ジャバスクリプト)のいくつかの並べ替えを使用する必要がします情報はクライアントによってサーバーに送信されません。

私はそれはあなたが任意の2つの文字列を比較することができ、時間の一定の尺度であるとして、あなたは$utc_timestampを格納することに変更する必要があります示唆しています。それはあなたが

+0

ありがとうございますが、私はかなりフォローしていません。私はクライアントのタイムゾーンに従ってデータを保存したければ、これがどのように役立つのか理解していると思います。しかし、これがどのようにしてUTC形式で保存されたデータを取得し、それをクライアントのタイムゾーンに変換するのに役立つのか分かりません。あなたはもう少し説明できますか?データを保存する方法を変更する必要がありますか(日付と時刻の代わりにタイムスタンプを保存しますか?)ありがとうございます。 – user418775

+0

@ user418775これはタイムスタンプとして保存する方が良いでしょう。しかし、 'mktime($ hour、$ minute、$ second、$ month、$ day、$ year、$ is_dst)'のように日付をタイムスタンプに変換することはできます。詳細はこちらhttp://php.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

関連する問題