Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将日期和时间从UTC转换为客户端';使用MYSQL的服务器上的本地时间_Php_Mysql_Timezone - Fatal编程技术网

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

Php 将日期和时间从UTC转换为客户端';使用MYSQL的服务器上的本地时间,php,mysql,timezone,Php,Mysql,Timezone,我有一个查询,它生成如下结果: 数据按日期描述排序,然后按时间描述排序,但常用的“markers\u name”元素也分块在一起。(它们只在每次约会时拼凑在一起) 为此,我在条件中为(标记id,日期)的每个组合获取MAX(time)值列表,然后将该列表连接到我从当前查询中获得的行集,并使用MAX(time)值进行排序: SELECT m.name AS markers_name, c.time AS conditions_time, c.date AS conditions_dat

我有一个查询,它生成如下结果:

数据按日期描述排序,然后按时间描述排序,但常用的“markers\u name”元素也分块在一起。(它们只在每次约会时拼凑在一起)

为此,我在
条件中为
(标记id,日期)
的每个组合获取
MAX(time)
值列表,然后将该列表连接到我从当前查询中获得的行集,并使用
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,但是改变我存储数据的方式有点可怕


提前感谢……

您可以使用
date\u default\u timezone\u set()
localtime($utc\u timestamp)
date($utc\u timestamp)
将utc时间戳转换为您选择的时区

date\u default\u timezone\u set()
的可接受参数(时区)列表如下:

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


我建议您改为存储
$utc_timestamp
,因为它是一个可以比较任意两个字符串的恒定时间度量。如果你想比较不同条目的年龄,这会让以后的工作变得更容易。等等,这就是我用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”,日期转换为“2012年1月1日星期日”。

谢谢,但恐怕我不太明白。我想我知道如果我想根据客户的时区存储数据,这会有什么帮助。但我不明白这如何帮助我检索以UTC格式存储的数据,并将其转换为客户端的时区。你能再解释一下吗?我是否需要更改存储数据的方式(存储时间戳而不是日期和时间?)谢谢。@user418775最好将其存储为时间戳是的,但是您可以将日期转换为时间戳,如so
mktime($hour,$minute,$second,$month,$day,$year,$isdst)
这里有更多信息: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时间。使用php重新分组数据会有点麻烦。你有没有可能帮我解释一下如何用查询本身解决我的问题?非常感谢。@user418775您不能使用MYSQL查询,因为事件是否发生在同一天取决于用户的时区,如果不将数据拉出并使用普通PHP,就无法转换表中的数据。如果您知道要查询的特定日期,则可以从该日期或日期之间的最大和最小时间创建时间戳,并搜索它们之间的时间戳,该时间戳将返回在单个日期发生的任何事件,无论您从哪个时区生成utc时间戳。(如果您存储的是时间戳,则为)