PHP & MySQL:将存储的时间戳转换为用户的本地时区



所以我有一个带有评论功能的网站,其中评论的时间戳存储在MySQL数据库中。据我了解,时间戳在存储时会转换为 UTC,然后在检索时转换回默认时区。就我而言,我的服务器位于中部夏令时时区 (CDT)。

我有一个计划通过输入表单从每个用户那里获取时区。我只是想知道如何将 TIMESTAMP 值转换为用户的时区。

  • 首先,我会从 UTC 转换为本地时区吗?还是CDT到本地时区?
  • 其次,我将如何在PHP中做到这一点?我会做:
$userTimezone = 新的日期时区($userSubmittedTimezoneString);$myDateTime = 新的日期时间($storedTimestamp、$userTimezone);

。还是不正确?

日期/时间/日期时间值在您提供它们时存储在 MySQL 中。 即,如果您将字符串2012-04-17 12:03:23 INSERTDATETIME列中,那就是将存储的值。它将在内部转换为时间戳,该时间戳可能准确,也可能不准确(见下文),但是当您再次查询该值时,您将获得相同的值;往返是透明的。

如果您尝试在 SQL 中执行时间计算,则可能会出现问题,即任何需要 SQL 考虑时区和/或服务器时间的操作。例如,使用 NOW() .对于任何这些操作,正确设置时区和/或服务器时间。请参阅时区问题。

如果这与你无关,你只需要在PHP中进行计算,你只需要确保你知道要从哪个时区转换为哪个时区。为此,将所有时间标准化为 UTC 可以很方便,但这不是必需的,因为从任何时区到任何其他时区的时区转换也同样有效,只要您清楚要转换的时区。

date_default_timezone_set('Asia/Tokyo'); // your reference timezone here
$date = date('Y-m-d H:i:s');
/* INSERT $date INTO database */;
$date = /* SELECT date FROM database */;
$usersTimezone = new DateTimeZone('America/Vancouver');
$l10nDate = new DateTime($date);
$l10nDate->setTimeZone($usersTimezone);
echo $l10nDate->format('Y-m-d H:i:s');

没有可靠的方法来获取用户的时区。时区信息不会在 HTTP 标头中发送。您能做的最好的事情是:

  1. 将 IP 地址与地理数据库进行匹配-或-
  2. 使用 Javascript 获取用户计算机上设置的时间,并将其发送到服务器 (AJAX) 或在客户端上创建时间字符串。
$timezone = new DateTimeZone('America/Vancouver');
$date = new DateTime(date('m/d/Y h:i:s a', time()));
$date->setTimeZone($timezone);
echo $date->format('l F j Y g:i:s A')."n";

new DateTime(date('m/d/Y h:i:s a', time()));替换为new DateTime("UTC Time");

您可以为每个用户输入创建新的DateTimeZone()对象。

这样做

的方法是使用 javascript。我认为最好的方法是将用户 GMT 存储到他的 cookie 中,然后在 PHP 进程表单上检索它。

<script language="javascript">
function TimeZoneCookie()
{
 var u_gmt = (-(new Date().getTimezoneOffset()))/60;
 var o_date = new Date("December 31, 2025");
 var v_cookie_date = o_date.toGMTString();
 var str_cookie = "utimezone="+u_gmt;
 str_cookie += ";expires=" + v_cookie_date;
 document.cookie=str_cookie;
}
//---------------------
TimeZoneCookie();
</script>

u_gmt解释道:

  1. Date().getTimezoneOffset() 在几分钟内将偏移量返回到 GMT-0
  2. 由于getTimezoneOffset()会将偏移量返回到 GMT-0 而不是 GMT-0,因此我们需要将其扭转过来。如何?很简单,只要知道-*-=+-*+=-。如果你懂基本的数学,你就已经知道这个原理了。
  3. 正如我在步骤 1 中所说,getTimezoneOffset() 将以分钟为单位返回偏移量,因此我们只需将其除以 60,因此我们可以获得 gmt 偏移量格式。

结果:(-(new Date().getTimezoneOffset()))/60


现在在 PHP 中检索 cookie:

<?php
$user_timezone = $_COOKIE['utimezone'];
?>

相关内容

  • 没有找到相关文章

最新更新