#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"));
Больше информации здесь:
Комментарии:
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::getOffset5. Извините, LazyOne, но я не могу гарантировать, что класс DateTime будет доступен на всех серверах.