2012-01-01 147 views
0

服務器我有一個產生這樣一個結果的查詢:轉換日期和時間從UTC到客戶端的本地時間與MYSQL

desired output

的數據按日期降序排序,然後按時間倒序,而且常見的'markers_name'元素也被組合在一起。 (他們只在每個日期分組在一起)。

要做到這一點,我得到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)來完成這個任務嗎?

客戶端使用ajax從服務器請求此數據,因此我可以使用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

這就是我用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,並將其發送回客戶端。在這一循環中,我已經把這個代碼,其將日期和時間從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」,這一次「數據庫二十點22分11' 秒。當客戶端提供-5(這是東部標準時間的值)時,上面的代碼將時間轉換爲'3:22 pm',並將日期轉換爲'Sun,Jan 1,2012'。

1

您可以結合使用date_default_timezone_set()localtime($utc_timestamp)date($utc_timestamp)的UTC時間戳轉換成您所選擇的時區。

接受PARAMATERS的列表(時區)爲date_default_timezone_set()在這裏找到:

List of supported timezones

這仍然會要求你使用某種類型的客戶端腳本(JavaScript的)來檢索用戶的時區,因爲這信息不會被客戶端發送到服務器。

我建議你應該改變存儲$utc_timestamp,因爲它是一個可以比較任何兩個字符串的時間常量。如果你想比較不同條目的年齡,它會使事情變得更容易。例如

+0

謝謝,但我恐怕我不太關注。我想我明白,如果我想根據客戶的時區存儲數據,這可能會有所幫助。但我不明白這是如何幫助我檢索以UTC格式存儲的數據,並將其轉換爲客戶端的時區。你能解釋一下嗎?我是否需要更改我的數據存儲方式(存儲時間戳而不是日期和時間?)謝謝。 – user418775 2012-01-01 16:43:32

+0

@ user418775將它存儲爲時間戳會更好,但是,您可以將日期轉換爲時間戳,例如'mktime($ hour,$ minute,$ second,$ month,$ day,$ year,$ is_dst)'更多的信息在這裏:http://php.net/manual/en/function.mktime.php – 2012-01-01 16:51:13

+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時,第一個和第三個條目都發生在12月31日。因此,它們需要分組在一起,但是由於MySQL查詢基於UTC時間,因此它們不會將它們分組在一起。 – user418775 2012-01-01 17:16:11

相關問題