Хорошо, поэтому я не уверен, что 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 неверно. Поэтому я и оставил его.
Если вам просто нужно вычислить разницу между двумя значениями времени:
<?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)
Относительно этого кода:
$time = $_POST['time'];
Если ваши пользователи из разных уголков мира, вы должны:
Вы можете позже преобразовать дату на стороне сервера и сохранить ее в базе данных:
<?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
Без информации о часовом поясе ваши расчеты будут ненадежными.
На самом деле … это намного проще:
<?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
<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 тоже.