Как конвертировать datetime в GMT в php

Хорошо, поэтому я не уверен, что im конвертирует время ввода пользователя в GMT должным образом. У меня будут пользователи через несколько часовых поясов, входящих в «события», и им нужно будет иметь возможность видеть «как долго дольше» или «сколько времени» текущего time();

Вот как я планировал преобразовать время ввода. Это начнется как-то как 07/21/2011 01:30 am Затем,

 echo gmdate('Ymd H:i:s',strtotime('07/21/2011 01:30 am')); 

дает мне 2011-07-21 08:30:00

Поэтому я планировал взять значение gmdate('Ymd H:i:s',strtotime('07/21/2011 01:30 am')); затем занять time() и отобразить «сколько времени до этого события» для пользователей. Но похоже, что на результат всегда добавлено 10 часов, поэтому, если бы я планировал 30-минутное мероприятие, он сказал бы 10 часов 30 минут. Таким образом, я думаю, что я не буду правильно преобразовывать местное время или что-то в этом роде.

Что мне не хватает? Возможно, я просто неправильно понимаю GMT. Как я могу убедиться, что все время было GMT, поэтому все времена универсальны для всех пользователей на веб-сайте?

Другая информация, если это помогает: Часовой пояс сервера – America/Los_Angeles

EDIT: после всяких предложений я попытался установить это в верхней части моего php-кода:

date_default_timezone_set("GMT");

и я попробовал использовать date('Ymd H:i:s') чтобы сделать сравнение, чтобы выяснить diff, но его высказывание «3 часа назад», а не через 10 часов. Так что это окончательно изменило ситуацию.

Но все-таки не правильно.

Я подтвердил date('Ymd H:i:s') возвращает правильный и текущий GMT. Так что это хорошо.

Но дата ввода пользователя отключена. Как я его неправильно конвертирую?


ИЗМЕНИТЬ СНОВА (включая некоторые результаты теста после предложений Салмана А):

2:55 am – мое текущее местное время EST

date('Ymd H:i:s') появляется как 2011-07-21 06:56:43 – что правильно

3:00 утра EST – это время в будущем, которое я представил как 07/21/2011 03:00 am

Вот как я получаю время «преобразовать его» и отправить его в мою БД:

 $time = $_POST['time']; //there is where im assuming it turns my EST time to the GMT equivalent. $the_date = strtotime($time . ' GMT'); $utctime = gmdate('Ymd H:i:s',$the_date); 

Я ожидаю, что моя функция сообщит мне, что мероприятие прошло через 5 минут, но его часы отключены.

просто чтобы убедиться, что пользователь отправил время, фактически был преобразован в GMT i, отображающий $utctime и он появляется как 2011-07-21 03:00:00 – который не является 08:00 или 07:00 (что, я думаю, один из тех будет эквивалент GMT)

Итак, как мне его преобразовать?

Итак, что я вижу strtotime($time . ' GMT'); похоже, не применяет GMT к местному времени, которое я предоставляю. На стороне примечания: somone предложил мне date_default_timezone_set("GMT"); в моем коде, поэтому у меня оно наверху. Должен ли я удалить его? но я заметил, что если я удалю его, то GMT неверно. Поэтому я и оставил его.

Solutions Collecting From Web of "Как конвертировать datetime в GMT в php"

Если вам просто нужно вычислить разницу между двумя значениями времени:

 <?php $time = '07/21/2011 11:30 am'; $timeleft = strtotime($time) - time(); // target time....: 2011-07-21 11:30:00 // current time...: 2011-07-21 11:13:45 // difference.....: 975 seconds (16 min, 15 seconds) 

В приведенном выше примере предполагается, что $time имеет тот же часовой пояс, что и функция time() то есть часовой пояс сервера.

Если временные интервалы отличаются, вы должны их нормализовать, чтобы вычитание работало так, как ожидалось. Например, если вы сохраняете дату / время GMT в своей базе данных, то приведенный выше пример становится:

 <?php $time = '07/21/2011 06:30 am'; $timeleft = strtotime($time . ' GMT') - time(); // target time............: 2011-07-21 06:30:00 GMT // converted local time...: 2011-07-21 11:30:00 PKT // current time...........: 2011-07-21 11:34:48 PKT // difference.............: -288 seconds (minus 4 minutes, 48 seconds) 

Редактировать 1

Относительно этого кода:

 $time = $_POST['time']; 

Если ваши пользователи из разных уголков мира, вы должны:

  • попросите их ввести дату / время в GMT
  • попросите их ввести часовой пояс для введенной даты

Вы можете позже преобразовать дату на стороне сервера и сохранить ее в базе данных:

 <?php $source_time = '2011-07-21 17:00'; $source_offset = '-0700'; // PDT $local_timestamp = strtotime($source_time . ' ' . $source_offset); // 2011-07-22 05:00 PKT (SERVER TIME) list( $temp_hh, $temp_mm ) = explode(':', date('P')); // returns difference between SERVER TIME and GMT $local_offset = $temp_hh * 3600 + $temp_mm * 60; $gmt_timestamp = $local_timestamp + $local_offset; echo date("Ymd H:i:s", $gmt_timestamp); // 2011-07-21 10:00:00 // THIS is what you store in your database // Same as 2011-07-21 17:00:00 minus 7 hours 

Без информации о часовом поясе ваши расчеты будут ненадежными.

Редактировать # 2

На самом деле … это намного проще:

 <?php $source_time = '2011-07-21 17:00'; $source_offset = -7.0; // -0700 echo date("Ymd H:i:s", strtotime($source_time) + $source_offset * 3600); // 2011-07-21 10:00:00 // THIS is what you store in your database 

Редактировать # 3

 <input type="text" name="time" id="time" value="07/21/2011 17:00"> <input type="text" name="offset" id="offset"> <script type="text/javascript"> document.getElementById("time").onchange = function(){ var d = new Date(this.value); alert('Date entered: ' + d + '\nDate to GMT: ' + d.toUTCString()); } document.getElementById("offset").value = (new Date()).getTimezoneOffset() / 60; </script> 

Демо здесь

Хорошая идея – явно установить часовой пояс для ваших скриптов. Например:

 date_default_timezone_set('Europe/London'); 

Это заставит все функции даты возвращать даты в GMT, и я считаю, что учет BST тоже.