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

Все было хорошо, когда я работал над Wampserver на местном.

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

Я использую плагин timeago, который обрабатывает дату и отображает прошедшее время (есть .. сек назад, есть .. мин назад, есть .. ч назад, есть .. год назад) с момента публикации содержания.

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

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

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

Я попробовал это:

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

Но вместо того, чтобы дать мне «30 секунд назад», он дает мне «2 часа назад».

Спасибо.

0
ankalagba 22 Фев 2020 в 13:56

2 ответа

Лучший ответ

Я подозреваю, что вы рассчитываете относительное время на стороне клиента. Например, с помощью 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>
1
artoodetoo 22 Фев 2020 в 13:47

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

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

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

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

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

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

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

1
Anonymous 22 Фев 2020 в 14:31