服务器我有一个产生这样一个结果的查询:转换日期和时间从UTC到客户端的本地时间与MYSQL
的数据按日期降序排序,然后按时间倒序,而且常见的'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存储$时间和$日期,而不是,但它是一个有点吓人改变我一直在存储我的数据的方式。
在此先感谢....
谢谢,但我恐怕我不太关注。我想我明白,如果我想根据客户的时区存储数据,这可能会有所帮助。但我不明白这是如何帮助我检索以UTC格式存储的数据,并将其转换为客户端的时区。你能解释一下吗?我是否需要更改我的数据存储方式(存储时间戳而不是日期和时间?)谢谢。 – user418775 2012-01-01 16:43:32
@ user418775将它存储为时间戳会更好,但是,您可以将日期转换为时间戳,例如'mktime($ hour,$ minute,$ second,$ month,$ day,$ year,$ is_dst)'更多的信息在这里:http://php.net/manual/en/function.mktime.php – 2012-01-01 16:51:13
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