Конвертировать дату и время из UTC в местное время клиента на сервере с помощью MYSQL - PullRequest
0 голосов
/ 01 января 2012

У меня есть запрос, который выдает результат, подобный следующему:

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

Дата и время хранятся в базе данных MySQL как время UTC.Клиент использует 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 ]

1 голос
/ 02 января 2012

Вот как я решил свою проблему с 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 '.Приведенный выше код преобразует время в «15:22», а дату в «Солнце, 1 января 2012 г.», когда клиент предоставляет -5 (что является значением для восточного стандартного времени).

1 голос
/ 01 января 2012

Вы можете использовать date_default_timezone_set() в сочетании с localtime($utc_timestamp) или date($utc_timestamp) для преобразования метки времени UTC в выбранный вами часовой пояс.

Список принятых параметров (часовых поясов) для date_default_timezone_set() находится здесь:

Список поддерживаемых часовых поясов

Для этого по-прежнему потребуется использовать какой-либо сценарий на стороне клиента (javascript) для получения часового пояса пользователя, поскольку эта информация не отправляется на сервер клиентом.

Я предлагаю вам перейти к сохранению $utc_timestamp, поскольку это постоянная мера времени, с которой вы можете сравнивать любые две строки. В будущем это будет намного проще, если вы хотите сравнить возраст различных записей .etc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...