Как бороться с разницей часовых поясов - PullRequest
0 голосов
/ 22 февраля 2020

Используя mysql, в таблице сообщений я использую CURRENT_TIMESTAMP для хранения даты и времени публикации.

Все было нормально, когда я работал на локальном wampserver.

Но я вчера разместил свой сайт на сервере, расположенном во Франции, в 2 часах от часового пояса моей страны.

Я использую плагин timea go, который обрабатывает дату и отображает прошедшее время (есть .. se c a go, есть .. min a go, есть .. ha go, есть .. год a go) с момента публикации содержание.

После публикации я вижу «2 часа a go», когда я только что опубликовал 30 секунд a go.

Как я могу принять во внимание часовой пояс моего пользователи сравнивают дату и время сервера моего хоста?

Пример: если я опубликую контент, через 30 секунд я и пользователь, находящийся в Китае или где-либо еще, должны увидеть "30 секунд go ".

Я пытался это сделать:

$d ="2020-02-28T13:09:33Z";
<time class='timeago' datetime='<?= $d ?>'> </time> 

Но вместо того, чтобы дать мне" 30 секунд go ", это дает мне" 2 часов go ".

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

MySQL хранит DATETIME без информации о часовом поясе, но значения даты и времени, которые не учитывают часовой пояс, наполовину бесполезны.

Таким образом, у вас есть разные варианты.

Первый вариант: продолжить сохранение значения даты и времени в вашем текущем часовом поясе, но добавьте второй столбец с соответствующим «смещением» по сравнению с UT C, например, +1, если вы находитесь во Франции. Затем вы можете выполнить расчет на лету в другой часовой пояс, но это сложно из-за настроек летнего времени. В течение определенного периода года смещение будет +1, в других случаях это может быть +2. Поэтому я не рекомендую этот подход. Он не будет хорошо масштабироваться с течением времени.

Другой вариант: вы можете сохранить все значения даты и времени как UT C в своей базе данных, а затем в своем приложении вы пересчитаете их, применяя правильное смещение в соответствии с вашим часовым поясом. (или что из ваших веб-посетителей). Это лучший вариант.

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

PHP имеет функции для обработки преобразования часового пояса, см., Например: https://www.php.net/manual/en/class.datetimezone.php

Обратите внимание, что TIMESTAMP ограничен 1970-2038 ... Год 2038, проблема

1 голос
/ 22 февраля 2020

Я подозреваю, что вы рассчитываете относительное время на стороне клиента. Например, timego плагин.

Ни MySQL, ни PHP не знают местоположение пользователя и часовой пояс. Поэтому лучше сообщить JS о часовом поясе сервера и дать ему возможность вычислить смещение вправо.

Используйте формат даты и времени ISO 8601, чтобы timeago узнал о часовом поясе сервера. Все остальное до JS плагин:

<?php

$ts = strtotime($row['date_time']);

?>

<time class="timeago" datetime="<?= date(DATE_ISO8601, $ts) ?>">

    <?= date('Y-m-d H:i:s', $ts) ?>

</time>


<script type="text/javascript">

    jQuery(function($) {

        $("time.DateTime").timeago();

    });

</script>
...