Время изменения файла PHP используйте настройку смещения по Гринвичу, чтобы сообщить правильное время

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

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


person Scott    schedule 09.06.2011    source источник
comment
как вы храните часовой пояс пользователя? Как целочисленное смещение?   -  person Chris Laarman    schedule 09.06.2011
comment
да. извините, забыл упомянуть об этом. E.G $ gmt_offset = -4;   -  person Scott    schedule 09.06.2011
comment
Ваш сервер находится в часовом поясе GMT?   -  person Pekka    schedule 09.06.2011
comment
@Pekka сервер может быть где угодно в мире.   -  person Scott    schedule 09.06.2011
comment
так что вам тоже понадобится часовой пояс сервера?   -  person Chris Laarman    schedule 09.06.2011
comment
@Brady, а вы можете определить часовой пояс сервера? Или вам нужно это выяснить?   -  person Pekka    schedule 09.06.2011
comment
@Pekka - PHP должен выяснить это. Этот сценарий может использоваться множеством людей в разных странах и на серверах, находящихся в разных местах.   -  person Scott    schedule 09.06.2011


Ответы (3)


Вам нужна функция 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

person Chris Laarman    schedule 09.06.2011
comment
Но сработает ли это? Что, если бы сервер был в GMT-2, а пользователь был в GMT-4. - person Scott; 09.06.2011
comment
Этот ответ был дан до того, как я понял, что вам тоже нужно смещение сервера. Так что это не сработает. Отредактирую ответ - person Chris Laarman; 09.06.2011
comment
Куда мне добавить $timestamp значение filetime()? - person Scott; 09.06.2011
comment
Это будет примерно так: gmdate("H:i:s", ($timestamp + ($gmt_offset * 3600))); - person Chris Laarman; 09.06.2011
comment
Спасибо XpertEase. Я сам пришел к тому же коду. Просто сейчас тестирую. - person Scott; 09.06.2011

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

<?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
person Salman A    schedule 09.06.2011

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

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

person LazyOne    schedule 09.06.2011
comment
Вы предполагаете, что сервер находится в GMT-0? - person Scott; 09.06.2011
comment
@Brady: Нет, здесь смещение будет относительно времени сервера. Вы можете добавить дополнительную поправку для часового пояса сервера (например, $server_offset) - person LazyOne; 09.06.2011
comment
@LazyOne: а как проверить часовой пояс серверного времени? - person Chris Laarman; 09.06.2011
comment
@ XpertEase2: Хорошо, если вы знаете, где находится ваш сервер / какой часовой пояс вы установили там, тогда $server_offset можно жестко запрограммировать / объявить как постоянный. Если вам нужно рассчитать его динамически - посмотрите DateTime :: getOffset - person LazyOne; 09.06.2011
comment
Извините, LazyOne, но я не могу гарантировать, что класс DateTime будет доступен на всех серверах. - person Scott; 09.06.2011
comment
@Brady: DateTime - это стандартный класс PHP, доступный с версии PHP v5.2.0 (выпущенной 2 ноября 2006 г.), которая сейчас устарела (поддерживается только 5.3.x). Сколько лет этим серверам (с точки зрения установки PHP) и почему кто-то все еще может использовать такую ​​старую версию (‹5.2), если 5.2.x (особенно 5.3.x) определенно быстрее (никаких сомнений)? Единственная причина - ОЧЕНЬ старый код НАСЛЕДИЯ. - person LazyOne; 09.06.2011
comment
@brady: проверь мой ответ. Вы можете использовать date("P") в PHP 5.1.3 и новее. - person Salman A; 09.06.2011