Время изменения PHP-файла используйте настройку смещения GMT для сообщения правильного времени

#php #datetime #timezone #gmt #filetime

#php #datetime #Часовой пояс #gmt #filetime

Вопрос:

В настоящее время я сообщаю о времени изменения файла следующим образом:

 $this->newScanData[$key]["modified"] = filemtime($path."/".$file);
$modifiedtime = date($date_format." ".$time_format, $this->newScanData[$key]["modified"]);
  

Лично я думал, что в этом нет ничего плохого, но пользователь моего кода сообщает, что прошло 4 часа. Единственная причина, по которой я могу думать об этом, заключается в том, что сервер находится в часовом поясе, отличном от пользовательского. У каждого пользователя есть переменная, которую я могу использовать $gmt_offset , которая хранит часовой пояс, в котором находится пользователь. $gmt_offset сохраняется как базовое смещение с плавающей точкой.

Сервер может находиться в любом часовом поясе, не обязательно в GMT-0. Сервер может находиться в другом часовом поясе, что и пользователь.

Как мне получить $modifiedtime правильное время для пользователя в его часовом поясе на основе $gmt_offset ?

Комментарии:

1. как вы сохраняете часовой пояс пользователя? Как смещение целого числа?

2. Да. извините, забыл упомянуть об этом. Например, $ gmt_offset = -4;

3. Находится ли ваш сервер в часовом поясе GMT?

4. @Pekka сервер может быть в любой точке мира.

5. так вам тоже понадобится часовой пояс сервера?

Ответ №1:

filemtime() вернет временную метку unix на основе часов сервера. Поскольку у вас доступно смещение пользователя к gmt, вы должны преобразовать временную метку unix в GMT, а затем в пользовательский timszone следующим образом:

 <?php
    list($temp_hh, $temp_mm) = explode(':', date('P'));
    $gmt_offset_server = $temp_hh   $temp_mm / 60;
    $gmt_offset_user   = -7.0;
    $timestamp         = filemtime(__FILE__);
    echo sprintf('
        Time based on server time.........: %s
        Time converted to GMT.............: %s
        Time converted to user timezone...: %s
        Auto calculated server timezone...: %s
        ',
        date('Y-m-d h:i:s A', $timestamp),
        date('Y-m-d h:i:s A', $timestamp - $gmt_offset_server * 3600),
        date('Y-m-d h:i:s A', $timestamp - $gmt_offset_server * 3600   $gmt_offset_user * 3600),
        $gmt_offset_server
    );

    // Output based on server timezone = PKT ( 05:00 GMT) and user timezone = PDT (-07:00 GMT)
    // Time based on server time.........: 2011-06-09 03:54:38 PM
    // Time converted to GMT.............: 2011-06-09 10:54:38 AM
    // Time converted to user timezone...: 2011-06-09 03:54:38 AM
    // Auto calculated server timezone...: 5
  

Ответ №2:

Что вам нужно, так это strtotime() функция. Изменил дату на gmdate, переведя время вашего сервера в GMT

Например, если вам нужен формат времени, такой как 10:00:00

 gmdate("H:i:s", strtotime($gmt_offset . " hours"));
  

Больше информации здесь:

http://php.net/manual/en/function.strtotime.php

http://php.net/manual/en/function.gmdate.php

Комментарии:

1. Но сработает ли это? Что, если сервер был в GMT-2, а пользователь — в GMT-4.

2. Этот ответ был дан до того, как я понял, что вам тоже нужно смещение сервера. Так что это так работать не будет. Отредактирует ответ

3. Куда мне ввести $timestamp значение filetime() ?

4. Это было бы что-то вроде: gmdate("H:i:s", ($timestamp ($gmt_offset * 3600)));

5. Благодаря XpertEase я сам пришел к тому же коду. Просто тестирую сейчас.

Ответ №3:

 $modifiedtime = date($date_format." ".$time_format, $this->newScanData[$key]["modified"]   ($gmt_offset * 3600));
  

$ gmt_offset должен иметь тип float, а не int — некоторые часовые пояса могут иметь дробную разницу, например, GMT 09:30 для Аделаиды

Комментарии:

1. Здесь вы предполагаете, что сервер находится в GMT-0?

2. @Brady: Нет, здесь смещение будет относительно времени сервера. Вы можете добавить дополнительную коррекцию для часового пояса сервера (например, $server_offset )

3. @LazyOne: а как вы проверяете часовой пояс серверного времени?

4. @XpertEase2: Ну, если вы знаете, где расположен ваш сервер / какой часовой пояс вы там настроили, то он $server_offset может быть жестко запрограммирован / объявлен как постоянный. Если вам нужно вычислить его динамически — посмотрите на DateTime::getOffset

5. Извините, LazyOne, но я не могу гарантировать, что класс DateTime будет доступен на всех серверах.