mktime возвращает одно и то же значение в разных часовых поясах PHP - PullRequest
1 голос
/ 27 апреля 2019

Обычно этот вопрос имеет противоположный смысл. Но я столкнулся с проблемой, заключающейся в том, что функция PHP mktime() всегда дает мне метку времени UTC, несмотря на изменение часового пояса по умолчанию. Другими словами, имея эту простую страницу:

<!DOCTYPE html>
<html>
<body>
<div>
    <?php
    echo phpversion().'<br />';
    date_default_timezone_set('America/Los_Angeles');
    $script_tz = date_default_timezone_get();
    echo $script_tz.'<br>';
    $user_now = mktime();
    echo $user_now.'<br />'."\r\n";

    date_default_timezone_set('UTC');
    $script_tz = date_default_timezone_get();
    echo $script_tz.'<br>';
    $utc_now = mktime();
    echo $utc_now.'<br />'."\r\n";
    ?>
 </div>
</body>
</html>

Я получаю это:

5.3.28<br>
America/Los_Angeles<br>
1556333103<br>
UTC<br>
1556333103<br>

в результате. Как вы можете видеть одно и то же значение в разных часовых поясах. Вы можете убедиться в этом, следуя странице с этим HTML-кодом

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

1 Ответ

2 голосов
/ 27 апреля 2019

На временные метки не влияют часовые пояса (это просто количество секунд с начала эпохи Unix, одинаковое независимо от вашего часового пояса), поэтому mktime возвращает одно и то же значение для того же времени.Однако при отображении этого значения (например, с помощью date) вы увидите разницу от двух часовых поясов:

date_default_timezone_set('America/Los_Angeles');
$script_tz = date_default_timezone_get();
echo $script_tz.'<br>';
$user_now = time();
echo $user_now.'<br />'."\r\n";
echo date('Y-m-d H:i:s', $user_now).'<br />'."\r\n";

date_default_timezone_set('UTC');
$script_tz = date_default_timezone_get();
echo $script_tz.'<br>';
$utc_now = time();
echo $utc_now.'<br />'."\r\n";
echo date('Y-m-d H:i:s', $utc_now).'<br />'."\r\n";

Вывод:

America/Los_Angeles<br>1556334114<br /> 2019-04-26 20:01:54<br />
UTC<br>1556334114<br /> 2019-04-27 03:01:54<br />

Обратите внимание, что mktime без аргументов устарела , вам следует просто использовать time.

Демонстрация на 3v4l.org

...