Как конвертировать дату и время в GMT в php - PullRequest
0 голосов
/ 21 июля 2011

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

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

echo gmdate('Y-m-d H:i:s',strtotime('07/21/2011 01:30 am'));

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

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

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

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

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

date_default_timezone_set("GMT");

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

Но все еще не правильно.

Я подтвердил, date('Y-m-d H:i:s') возвращает правильное и текущее время по Гринвичу. Так что это хорошо.

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


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

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

date('Y-m-d 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('Y-m-d H:i:s',$the_date);

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

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

Так как мне его конвертировать?

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

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

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

<?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)

Edit 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("Y-m-d 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

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

Edit # 2

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

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

Edit # 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>

Демонстрация здесь

1 голос
/ 21 июля 2011

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

date_default_timezone_set('Europe/London');

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

0 голосов
/ 01 марта 2019

Здравствуйте, я живу в Польше и у нас время CET.Для преобразования CET в GMT я использую функцию:

function convertCETtoGMT($timeCET)
    {
        date_default_timezone_set('EUROPE/London');
        $time = $timeCET." CET";
        $timeGMT = date('Y-m-d H:i:s', strtotime($time));
        date_default_timezone_set('EUROPE/Warsaw'); //set back to CET
        return $timeGMT;
    }
...