使用MYSQL在服务器上将日期和时间从UTC转换为客户端的本地时间

时间:2012-01-01 16:28:39

标签: php mysql timezone

我有一个产生如下结果的查询:

desired output

数据按日期DESC排序,然后按时间DESC排序,但常见的'markers_name'元素也被排在一起。 (他们每个日期只是在一起)。

要执行此操作,我会在MAX(time)中获取(markers_id, date)的每个组合的conditions值列表,然后将该列表加入我从当前查询中获取的行集,并且使用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而不是$ time和$ date,但改变我存储数据的方式有点可怕。

提前致谢....

2 个答案:

答案 0 :(得分:1)

您可以将date_default_timezone_set()localtime($utc_timestamp)date($utc_timestamp)结合使用,将UTC时间戳转换为您选择的时区。

date_default_timezone_set()的已接受参数列表(时区)可在此处找到:

List of supported timezones

这仍然需要您使用某种客户端脚本(javascript)来检索用户的时区,因为客户端不会将此信息发送到服务器。

我建议您应该更改为存储$utc_timestamp,因为它是您可以比较任何两个字符串的常量时间度量。如果你想比较不同条目的年龄,那么将来会更容易.etc

答案 1 :(得分: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',这次'20:22:11'。当客户提供-5(这是东部标准时间的值)时,上面的代码将时间转换为'3:22 pm',日期转换为'Sun,Jan 1,2012'。