时差如何处理
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
使用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