2012-01-01 110 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

相关问题