时差如何处理

How to deal with the time zone difference

使用mysql,在post table中我使用CURRENT_TIMESTAMP来存储date_time发布。

当我在本地使用 wampserver 时一切正常。

但我昨天在位于法国的服务器上托管了我的网站,距离我所在国家/地区的时区有 2 小时的路程。

我正在使用一个处理日期并显示经过时间的 timeago 插件(有 .. 秒前,有 .. 分钟前,有 .. 小时前,有 .. 年ago)自发布一个内容。

在 posting 后,我在 30 秒前刚发布时看到“2 小时前”。

如何将我的用户的时区与主机服务器的日期和时间相比较?

示例:如果我post一个内容,30秒后我和在中国或任何地方的用户必须看到“30秒前”。

我试过了:

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

但不是给我“30 秒前”,而是给我“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>

MySQL 存储没有时区信息的 DATETIME,但不识别时区的日期时间值是半无用的。

所以你有不同的选择。

第一个选项:继续在您当前的时区中存储日期时间值,但添加第二列,其中包含正确的 'offset' 与 UTC,例如,如果您在法国则为 +1。然后你可以在另一个时区进行动态计算,但由于夏令时设置,这很棘手。在一年中的某个时期,偏移量将为+1,在其他时间可能为+2。 所以我不推荐这种方法。随着时间的推移,它不会很好地扩展。

其他选项:您可以将所有日期时间值作为 UTC 存储在数据库中,并且 然后在您的应用程序中,您可以根据您自己的时区(或您的网络访问者的时区)应用正确的偏移量来重新计算它们。 这是一个更好的选择。

无论您做什么,了解适用于给定日期时间值的时区都很重要。所以选择一个并坚持下去。

PHP 具有处理时区转换的功能,例如:https://www.php.net/manual/en/class.datetimezone.php

请注意,TIMESTAMP 仅限于 1970-2038...Year 2038 problem